秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}

文章目录

    • 引言
    • 正文
      • 贪心——45 跳跃游戏II
        • 个人实现
        • 参考实现
      • 划分字母区间
        • 个人实现
        • 参考实现
      • 数组中的第K个最大元素
        • 个人实现
        • 参考做法
      • 前K个高频元素
        • 个人实现
        • 参考实现
    • 总结

引言

  • 今天就开始的蛮早的,现在是九点多,刚好开始做算法,今天有希望能够将项目的内容整理一下,然后再修改丰富一下我的简历,这个已经拖了很久了,加把劲,累点就累点吧。

正文

贪心——45 跳跃游戏II

题目链接
在这里插入图片描述
注意

  • 所有测试用例都是可到达,所有不用考虑不能到达最终目标的情况
  • 边界存在的条件为1的情况,需要考虑一下
  • 返回的是最小跳数
  • f[i] = f[i -1] + 1,如果f[i-1]到达时已经是最小跳数,那么f[i]的最小跳数就是上一个状态的最小跳数+1
个人实现
  • 想着使用动态规划实现,因为上一个状态最小的情况下,到当前状态的最小就是默认加1,想想看怎么做的。
  • f[i]表示从0到i的最小跳数,当前是在节点i,那么就遍历在当前nums[i]范围内的所有的跳数,更新一下对应的数组就行了。
class Solution {
public:int jump(vector<int>& nums) {vector<int> f(nums.size() + 1,INT_MAX);f[0] = 0;for(int i = 0;i < nums.size();i ++){for(int j = 1;j <= nums[i];j ++){if(i + j < nums.size()) f[i + j] = min(f[i + j],f[i] + 1);}}return f[nums.size() - 1];}
};
  • 意料之外,居然没有超时,我靠,太意料之外了。这个计算量得是10的7次方最大,居然没有超时,没超时就没超时把!

在这里插入图片描述

参考实现

在这里插入图片描述
在这里插入图片描述

  • 这里是维护跳数的区间数组,在某一个区间内的最小跳数始终是固定的,而且随着往后遍历,区间的跳数是递增的,根据上述推论实现代码如下
class Solution {
public:int jump(vector<int>& nums) {vector<int> f(nums.size() + 1,0);for(int i = 1,j = 0;i < nums.size();i ++){while(j + nums[j] < i)  j ++;       // 不断将j向后移动,保证当前跳数范围包括了对应if[i] = f[j] + 1;// 更新每一个节点所属的最少跳数段落信息,维护对应的数组}return f[nums.size() - 1];}
};

确实很巧妙,学到了,这个跳数这里应该不会再出问题了

这个可以看看之前的做的跳跃游戏原始版本,题目链接

  • 那道题也是使用类似方法,主要是通过最远距离和i之间的关系,判定能否到达最远距离,中间会不会出现断链的情况。

划分字母区间

  • 题目链接
    在这里插入图片描述
    在这里插入图片描述

注意

  • 同一个字母最多出现在一个片段中,每一个字母只能用一次
  • 片段数最多的情况
  • 所有划分结果顺序拼接,最终仍然是s
  • 小写英文字母组成
  • 长度最小是1
    保证每一个片段的字母是彼此不同的,而且要保证最终的片段数尽可能多
个人实现
  • 这里有一个约束,就是每一个字母只能在一个片段出现,不能横跨两个片段,这个怎么实现?
  • 这个题也是类似横跨区间的问题,保证一个字母出现的第一个索引和最后一个索引都是在同一个片段内部,不然就不满足约束条件,所以需要记录所有的字母的出现的两个位置。
  • 然后就是怎么合理的安排区间的问题。是否需要进行二次遍历,保证区间的相互包含,从而实现最多的划分。
  • 这里的时间复杂度目测是O(n),我需要遍历两次
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> res;// 更新记录每一个元素出现的最早的位置和vector<pair<int,int>> word(27,{s.size() - 1,0});for(int i = 0;i < s.size();i ++){word[s[i] - 'a'].first = min(i,word[s[i] - 'a'].first);word[s[i] - 'a'].second = max(i, word[s[i] - 'a'].second);}cout<<word[s[0] - 'a'].first<<endl;cout<<word[s[0] - 'a'].second<<endl;// 再次遍历计算区间的长度int beg = word[s[0] - 'a'].first , end = word[s[0] - 'a'].second;for(int i = 0;i < s.size();i ++){end = max(word[s[i] - 'a'].second,end);if(i == end){// 遍历到尾节点,直接添加结果res.push_back(end - beg + 1);beg = i + 1;if(i + 1 < s.size())    end = word[s[i + 1] - 'a'].second;}}return res;}
};

在这里插入图片描述

  • 这个方法中规中矩,没有任何异常,代码量也挺多的。不过做出来了。
参考实现

序列是无序的

  • 从前往后和从后往前效果是一样的
  • 是否需要进行排序,保证他是有序的,降低问题的难度

正式思路

  • 思路和我的差不多,只不过 他是仅仅记录了每一个字母出现的最终位置,而且使用的是hashmap,这里就得讨论一下,使用数组和hashmap哪个更快。理论上来时数组更快,但是写起来比较难看。

  • 具体实现代码如下,基本上都是一致的

class Solution {
public:vector<int> partitionLabels(string s) {vector<int> res;// 更新记录每一个元素出现的最早的位置和vector<int> word(27,0);for(int i = 0;i < s.size();i ++){word[s[i] - 'a'] = max(i, word[s[i] - 'a']);}cout<<word[s[0] - 'a']<<endl;// 再次遍历计算区间的长度int beg = 0 , end = word[s[0] - 'a'];for(int i = 0;i < s.size();i ++){end = max(word[s[i] - 'a'],end);if(i == end){// 遍历到尾节点,直接添加结果res.push_back(end - beg + 1);beg = i + 1;if(i + 1 < s.size())    end = word[s[i + 1] - 'a'];}}return res;}
};

数组中的第K个最大元素

题目链接
在这里插入图片描述
注意

  • 规定了时间复杂度,O(n)只能遍历一次
  • 第K大的元素,是排序只有第K大的元素
  • 数组长度[1, 1 0 5 10^5 105]
  • 每一个元素范围是正负 1 0 4 10^{4} 104
  • 元素与元素之家存在重复的情况
个人实现
  • 这里是制定了,只能通过遍历来实现,想想看怎么做。
  • 转换一下问题思路,如果是找最大的元素,就是完整的遍历并且比较一遍,然后找最小的元素也使完整的遍历一遍,然后在比较一遍,确定一个最大值。
  • 如果是确定第二大的数字,就是如果一个数字比最大的大的话,就默认往后进行顺。
  • 所以这里想办法维护一个队列,每次都是从和队首元素进行比较,然后固定长度是K,如果超过了固定长度直接弹出最后一个元素。
  • 这样不一定是目标值。

对于队列的使用有点问题了,然后返回的是队首的元素。

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {queue<int> q;for(auto x :nums){//队列是空的,直接添加if(q.empty())   q.push(x);// 如果大于队首元素,直接入队if(q.back() < x )   q.push(x);while(q.size() > k)    q.pop();}return q.front();}
};
  • 这里只能通过一半的样例,如果一开始就给我最大值,通不过测试样例,所以不行!
  • 这个方法根本就不行!
    在这里插入图片描述
  • 不会做!
  • 使用堆排序,肯定不对呀,是logN的操作复杂度
参考做法
  • 这里是一道模板题,是建立在快排的基础上实现的,所以需要背一下快排的模板,具体如下
    在这里插入图片描述
void quick_sort(int q[],int l,int r){if(l >= r)	return ;// 确定中间值、左边界、右边界// 中间元素不参加排序,i是从x的左侧一个开始,j是从x的右侧开始int i = l - 1,j = r + 1,x = q[l + r >> 1];while(i < j){do i ++; while(q[i] < x);do j -- ;while(q[j] > x);if(i < j)	swap(q[i],q[j]);}quick_sort(q,l,j),quick_sort(q,j + 1,r);
}
  • 这里的j就是最终的区分索引,所以k应该也是和j进行比较,然后再进行判定的是左边进行快排,还是右边进行快排。
  • 这是一道经典的模板题,需要好好背一下。
  • 根据模板题,好好做一下
class Solution {
public:int quickSort(vector<int> &nums,int l,int r,int k){if(l == r)  return  nums[k];int i = l - 1,j = r + 1 ,x = nums[(l + r) >> 1];while(i < j){do i ++ ;while(nums[i] > x);do j -- ; while(nums[j] < x);if(i < j) swap(nums[i],nums[j]);}   if(k <= j)   return quickSort(nums,l,j,k);else  return quickSort(nums,j + 1,r,k);}int findKthLargest(vector<int>& nums, int k) {return quickSort(nums,0,nums.size() - 1,k-1);}
};
  • 这是一个模板题,只能说是超过了我的知识范围,所以还是得不断补充完善。

前K个高频元素

题目链接

在这里插入图片描述
注意

  • 出现频率前K高的元素
  • 按照任意顺序返回
  • 数据保证答案唯一
个人实现
  • 这道题没有说数据是有序的,并不能从顺序进行考虑。
  • 最直白的做法, 统计每一个元素出现的次数,然后使用出现的次数进行排序,然后返回前k高地元素,也就是返回阈值之前的所有的元素。
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int>  counts;for(auto x : nums)  counts[x] ++;vector<pair<int,int>>   ct;for(auto item : counts) ct.push_back({item.first,item.second});sort(ct.begin(),ct.end(),[](auto a,auto b){return a.second > b.second;});vector<int> res;for(int i = 0;i < k;i ++)   res.push_back(ct[i].first);return res;}
};
  • 纯硬做,直接模拟思路,完全照搬!
    在这里插入图片描述
参考实现
  • 前半部分思路是一样的,就是要统计每一个元素的出现的次数,然后形成一个key-value键值对,然后使用计数排序,实现前k个频率最高的元素的计算。
  • 具体代码如下
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int>  counts;for(auto x : nums)  counts[x] ++;int m = nums.size();vector<int>   ct(m + 1,0);// 实现计数排序for(auto [k,v]:counts)  ct[v] ++;// 遍历前k个元素,计算一个边界次数int edg = m,s = 0;while(s < k)   s+= ct[edg --];// 遍历获取的满足条件的kvector<int> res;for(auto [k,v]:counts)  {if(v > edg)   res.push_back(k);}return res;}
};

遍历map的好方法

  • 使用[a,b]然后加上auto实现
for(auto [k,v] : map)

总结

  • 大概测了一下,发现自己做一道题,加上修改的总结的时间是超过了50分钟的,有点吓人,一天得花多少时间是用来做算法题。还是得快一点。
  • 可以,今天的效率蛮快的,在十一点就完成了算法题的内容,下面再补充一下关于设计模式的相关知识,然后下午就看一下我们的项目了。加油,冲 !
  • 剑走偏锋呀,感觉自己的路子不对,很多东西都没有专门走过,所以就会有很多问题,现在得转换一下思路,项目的代码我看的不是很懂,那就要从不是很懂的地方一点点开始看,一点点开始弄。现在欠缺了太多东西,后续还要增加每天一样的知识补充。其实很多东西,都是要花时间去弄的,现在就是知道MySQL的基础的东西,但是对于高可用的东西,并不了解。然后Java的多线程编程也不知道,感觉还是得花大时间。
  • 现在应该专心去弄什么?有点乱,感觉有点自暴自弃,觉得完蛋了,但是其实那几个项目并不难,跟着往后做就行了。加油吧。如果有不懂的,就去找SSM中学过的,然后就是哪里不行,补充哪里。
  • 我得调整一下自己的计划,现在欠缺的是项目还有简历,得想办法结合项目,把简历整理出来,后续再根据简历上的东西进行一点点补充。
  • 看项目有点吃力,是因为我从来没有跟着一个东西,从头到尾敲过一个项目,所以看的很吃力。
  • 晚上有点摆烂了,学了一天了,太累了,晚上注意力难以集中!!
  • 明天加油吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/372137.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

方圆资源网,方圆资源官网

在当今这个信息化高速发展的时代&#xff0c;方圆资源网络已成为推动社会进步、促进经济发展的重要力量。方圆资源网不仅汇聚了海量的信息资源&#xff0c;更为我们提供了一个高效、便捷的信息交流平台。本文旨在详细介绍资源网的概念、特点、功能以及其在现代社会中的重要意义…

理解算法复杂度:空间复杂度详解

引言 在计算机科学中&#xff0c;算法复杂度是衡量算法效率的重要指标。时间复杂度和空间复杂度是算法复杂度的两个主要方面。在这篇博客中&#xff0c;我们将深入探讨空间复杂度&#xff0c;了解其定义、常见类型以及如何进行分析。空间复杂度是衡量算法在执行过程中所需内存…

【python爬虫实战】进阶天气虫虫(过程复盘 心得分享)

程序设计过程里的一些心得&#xff1a; 0. 规模较大的程序&#xff0c;往往都是以更小的功能块搭建起来的。如此&#xff0c;为了提升总体程序的构建效率&#xff0c; 笔者发现分“两步走”会比较高效&#xff1a; A. 遇到需要反复调试的功能块&#xff0c;可先在另一程序中逐…

植物大战僵尸融合嫁接版 MAC 版本下载安装详细教程

继植物大战僵尸杂交版火了之后&#xff0c;PVZ改版可谓是百花齐放&#xff0c;最近又有一个非常好玩的模式被开发出来了&#xff0c;他们称为《植物大战僵尸融合嫁接版》 该版本并没有对植物卡牌做改动&#xff0c;而是可以将任意两种植物叠放到一起进行融合&#xff0c;产生新…

玲珑大爆料!deepin Meetup(上海站)议程抢先看!

Linux软件生态正迎来一场革命&#xff0c;随着软件数量的激增&#xff0c;传统的包管理系统逐渐暴露出依赖性强、兼容性差、安全性不足等问题。“玲珑”是一种新型的独立包管理工具集&#xff0c;通过先进的隔离技术和分层管理&#xff0c;为应用提供了一个安全、稳定、高效的运…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间&#xff0c; 还是自己&#xff1f;懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING&#xff0c;一些日常&#xff0c;是烟火&#xff0c;也是幸福的印记。 当下也…

IT之家最新科技热点 | 小米 AI 研究院开创多模态通用模型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Python编程学习笔记(1)--- 变量和简单数据类型

1、变量 在学习编程语言之前&#xff0c;所接触的第一个程序&#xff0c;绝大多数都是&#xff1a; print("Hello world!") 接下来尝试使用一个变量。在代码中的开头添加一行代码&#xff0c;并对第二行代码进行修改&#xff0c;如下&#xff1a; message "…

3 个令人惊艳的 AI 开源工具,诞生了!

大家好&#xff0c;今天继续聊聊 AI 科技圈发生的那些事。分享几个最新好玩、实用的AI工具。更多最新技术&#xff0c;文末加入我们。 LivePortrait LivePortrait&#xff1a;一款可以轻松让一幅肖像栩栩如生的工具 它可以精准操控眼睛和嘴唇动作&#xff1a; 让静态照片变为…

python特征相关性可视化分析 - sns.pairplot

seaborn 是一个基于 matplotlib 的 Python 数据可视化库&#xff0c;提供了更高层次的接口来绘制有吸引力的统计图形。pairplot 是 seaborn 中的一个函数&#xff0c;用于绘制数据集中多个变量之间的成对关系图。 基本用法 pairplot 函数可以快速地对数据集中的所有数值变量进…

【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构

模型地址&#xff1a;https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要参考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下载到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

Yolov10训练,转化onnx,推理

yolov10对于大目标的效果好&#xff0c;小目标不好 一、如果你训练过yolov5&#xff0c;yolov8&#xff0c;的话那么你可以直接用之前的环境就行 目录 一、如果你训练过yolov5&#xff0c;yolov8&#xff0c;的话那么你可以直接用之前的环境就行 二、配置好后就可以配置文件…

身边的故事(十五):阿文的故事:再消失

物镜人非&#xff0c;沧海桑田。像我们这些普通的凡人&#xff0c;哪有什么试错的机会&#xff0c;每走一步都是如履薄冰&#xff0c;小心谨慎&#xff0c;错一步可能就会万劫不复。唉&#xff0c;如果...唉...哪有什么如果... 阿文的房子很快装修完成&#xff0c;入新房那天就…

提高Python爬虫的匿名性:代理ip的配置策略

在当今&#xff0c;网络数据采集作为获取行业信息的重要手段&#xff0c;尤其在竞争激烈的商业环境中&#xff0c;Python作为一种强大的编程语言&#xff0c;广泛应用于开发各种数据爬虫来自动化地抓取网络信息。然而&#xff0c;网站普遍采用防护措施&#xff0c;即使我们合规…

用QFramework重构飞机大战(Siki Andy的)(下01)(06-0? 游戏界面及之后的所有面板)

GitHub // 官网的 全民飞机大战&#xff08;第一季&#xff09;-----框架设计篇&#xff08;Unity 2017.3&#xff09; 全民飞机大战&#xff08;第二季&#xff09;-----游戏逻辑篇&#xff08;Unity 2017.3&#xff09; 全民飞机大战&#xff08;第三季&#xff09;-----完善…

【Java14】构造器

Java中的构造器在创建对象&#xff08;实例&#xff09;的时候执行初始化。Java类必须包含一个或一个以上的构造器。 Java中的构造器类似C中的构造函数。 Java中对象&#xff08;object&#xff09;的默认初始化规则是&#xff1a; 数值型变量初始化为0&#xff1b;布尔型变量…

js使用proxy代理监听控制事件

本文为proxy代理的实例应用&#xff0c;有关代理的内容可以参考&#xff1a; js语法---理解反射Reflect对象和代理Proxy对象 监听事件 要监听dom元素的事件&#xff0c;我们会采用回调触发的方式来执行操作&#xff0c; 而触发事件的过程很明显是一个异步操作&#xff0c;异…

【TB作品】51单片机 Proteus仿真 00013红外proteus仿真循迹避障小车

实验报告&#xff1a;智能小车系统设计与实现 一、背景介绍 本实验旨在设计并实现一个基于STC89C52单片机控制的智能小车系统。该系统通过超声波传感器进行避障&#xff0c;通过红外接收器实现远程控制&#xff0c;同时具备循迹功能。整个系统的核心是单片机&#xff0c;它通…