秋招突击——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 面向对象设计模式.…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

RFID推动新能源汽车零部件生产系统管理应用案例
RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...

SDU棋界精灵——硬件程序ESP32实现opus编码
一、 音频处理框架 该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节: 1.核心组件 (1) 音频前端处理 (AFE - Audio Front-End) main/components/audio_pipeline/afe_processor.c功能: 声学回声…...