秋招突击——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中学过的,然后就是哪里不行,补充哪里。
- 我得调整一下自己的计划,现在欠缺的是项目还有简历,得想办法结合项目,把简历整理出来,后续再根据简历上的东西进行一点点补充。
- 看项目有点吃力,是因为我从来没有跟着一个东西,从头到尾敲过一个项目,所以看的很吃力。
- 晚上有点摆烂了,学了一天了,太累了,晚上注意力难以集中!!
- 明天加油吧!
相关文章:
秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}
文章目录 引言正文贪心——45 跳跃游戏II个人实现参考实现 划分字母区间个人实现参考实现 数组中的第K个最大元素个人实现参考做法 前K个高频元素个人实现参考实现 总结 引言 今天就开始的蛮早的,现在是九点多,刚好开始做算法,今天有希望能够…...
【Linux】信号的处理
你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 信号的处理 1 信号的处理2 内核态 VS 用户态3 键盘输入数据的过程4 如何理解OS如何正常的运行5 如何进行信号捕捉信号处理的总结6 可重入函数volatile关…...
Python数据分析的数据导入和导出
在Python数据分析中,数据的导入和导出是非常关键的步骤。这些步骤通常涉及到将数据从外部文件(如CSV、Excel、数据库等)读入到Python程序中,以及将处理后的数据导出回外部文件或数据库。以下是一些常用的库和方法来实现这些操作。…...
【JAVA多线程】线程池概论
目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…...
java双亲委派机制
Java中的双亲委派机制(Parent Delegation Model)是一种类加载机制,它确保了类加载的安全性和一致性。该机制规定了类加载器在加载类时的顺序和方式,从而避免了重复加载和类冲突问题。 以下是一个简单的自定义类加载器的示例&#…...
记录第一次使用air热更新golang项目
下载 go install github.com/cosmtrek/airlatest 下载时提示: module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时,需要在go.mod中加上这么一句: replace github.com/cosmtrek/air &…...
Leetcode 3213. Construct String with Minimum Cost
Leetcode 3213. Construct String with Minimum Cost 1. 解题思路2. 代码实现 题目链接:3213. Construct String with Minimum Cost 1. 解题思路 这一题的话思路上还是比较直接的,就是一个trie树加一个动态规划,通过trie树来快速寻找每一个…...
python操作SQLite3数据库进行增删改查
python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…...
【电控笔记6.7】非最小相位系统
全通滤波器 [...
Day05-04-持续集成总结
Day05-04-持续集成总结 1. 持续集成2. 代码上线目标项目 1. 持续集成 git 基本使用, 拉取代码,上传代码,分支操作,tag标签 gitlab 用户 用户组 项目 , 备份,https,优化. jenkins 工具平台,运维核心, 自由风格工程,maven风格项目,流水线项目, 流水线(pipeline) mavenpom.xmlta…...
PyQt5动态热力图清空画布关闭ColorBar
PyQt5生成正弦波动态热力图清空画布关闭ColorBar 1、简介 生成随机正弦波,使用pyqtgraph展示出来,并且使用热力图展示不同频率的正弦波,使用不同的画布颜色显示热力图的变化。 使用python3.8 导入库: pip install matplotlib==3.7.5 pip install numpy==1.24.4 pip in…...
python爬虫入门(一)之HTTP请求和响应
一、爬虫的三个步骤(要学习的内容) 1、获取网页内容 (HTTP请求、Requests库) 2、解析网页内容 (HTML网页结构、Beautiful Soup库) 3、存储或分析数据 b站学习链接: 【【Python爬虫】爆肝两…...
华为OD机考题(HJ41 称砝码)
前言 经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。有需要的可以同步练习下。 描述 现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种砝码对应的数量为 x1,x2,x3...xn 。现在要…...
Qt涂鸦板
Qt版本:Qt6 具体代码: 头文件 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent n…...
C++_03
1、构造函数 1.1 什么是构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 每次构造的是构造成员变量的初始化值,内存空间等。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不…...
强化学习中的Double DQN、Dueling DQN和PER DQN算法详解及实战
1. 深度Q网络(DQN)回顾 DQN通过神经网络近似状态-动作值函数(Q函数),在训练过程中使用经验回放(Experience Replay)和固定目标网络(Fixed Target Network)来稳定训练过程…...
前端八股文 说一说样式优先级的规则是什么?
标准的回答 CSS样式的优先级应该分成四大类 第一类 !important: 😄无论引入方式是什么,选择器是什么,它的优先级都是最高的。 第二类 引入方式: 😄行内样式的优先级要高于嵌入和外链,嵌入和外链…...
洞察国内 AI 绘画行业的璀璨前景
在科技的浪潮中,AI 绘画如同一颗璀璨的新星,正在国内的艺术与技术领域绽放出耀眼的光芒。 近年来,国内 AI 绘画行业发展迅猛,展现出巨大的潜力。随着人工智能技术的不断突破,AI 绘画算法日益精进,能够生成…...
socket编程
文章目录 套接字网路字节序列TCP和UDP套接字 本文章主要介绍Linux下套接字的相关接口,和一些基础知识。 套接字 所有网络通信的行为本质都是进程间进行通信,网络通信也是进程间通信,只不过是不同主机上的两个进程之间的通信。网络通信对于双…...
python自动移除excel文件密码(升级v2版本)
欢迎查看第一版 https://blog.csdn.net/weixin_45631815/article/details/140013476?spm1001.2014.3001.5502 一功能改进 此版本主要改进功能有以下: 直接可以调用函数实现可以尝试多个密码没有加密的文件进行保存,可以按实际业务进行改进.思路来源:java 面向对象设计模式.…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
