当前位置: 首页 > news >正文

代码随想录刷题Day30

滑动窗口最大值

这道题需要使用的是优先队列/堆的数据结构,因为它是要不断地记录一串数据序列中的最大值,像这样的问题,堆可以自动维护堆顶元素是序列里的最大值/最小值。

这道题的思路是:

  1. 先把数组前k个数以pair<value,index>的形式放入堆中,把堆顶元素的value值放入答案向量res中;
  2. 对剩下的元素,依次比遍历
    1. 每次遍历时候,把当前元素的<value,index>放入堆中
    2. 从堆中取出堆顶元素,如果堆顶元素的index不在[i-k+1,i]这样一个范围内,就让堆pop掉堆顶元素,直到堆顶元素的index在[i-k+1,i]这个区间位置,并把堆顶元素的value值放入答案向量res中
    3. 不断循环上述两个步骤,直到所有元素遍历完
  3. 返回res结果

代码如下:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;int n = nums.size();priority_queue<pair<int,int>> a;    //默认先比较pair第一个元素,如果相等就比较下一个元素,第一个是value,第二个元素是Index.默认是大顶堆for(int i = 0;i<nums.size()&&i<k;i++){  //先把优先队列k个元素填充好a.emplace(nums[i],i);   //emplace函数可以用来创建一个优先队列的对象,并放入队列中}//第一个K序列里的最大的元素值res.push_back(a.top().first);//挨个遍历数组中的元素for(int i = k;i<n;i++){a.emplace(nums[i],i);while(a.top().second < i - k + 1){  //不断获取堆顶元素,直到堆顶元素的索引值在[i-k+1,i]范围内a.pop();}res.push_back(a.top().first);}return res;}
};

写代码发现,这里使用一个int n = nums.size()比直接在循环遍历时候直接让i<nums.size()会少花不少时间。

前K个高频元素

这道题在有了上面这题的基础上,继续做的话,会很容易想到思路,这里也是使用优先队列的方式。

先对数组中的元素借助map进行次数的统计,接着使用优先队列的方式,对map中的<次数,值>重新按照次数的大小降序排列,最后从优先队列中pop出k个值,就可以得到出现次数为前k的元素值,代码如下:

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {//使用map统计不同值出现的次数map<int,int> value_cnt_map;int n = nums.size();for(int i = 0;i<n;i++){if(value_cnt_map.find(nums[i])!= value_cnt_map.end()){value_cnt_map[nums[i]]++;}else{value_cnt_map[nums[i]] = 1;}}//使用优先队列对(次数,值)按照出现次数降序排列priority_queue<pair<int,int>> cnt_value_heap;for(map<int,int>::iterator it = value_cnt_map.begin();it!= value_cnt_map.end();++it){cnt_value_heap.emplace(it->second,it->first);}//k次提取堆顶的值,也就是出现次数前k大的值放入答案ans中vector<int> ans;while(k--){ans.push_back(cnt_value_heap.top().second);cnt_value_heap.pop();}return ans;}
};

栈与队列系列刷题小结

该系列刷题,我重新回顾了栈和队列的一些基础用法,以及STL中相关的数据结构的使用。

刷题主要有三类:

  • 栈和队列的基础性质:
    • 使用两个栈来实现队列,主要是如何用栈的LIFO(Last in,first out 后入先出)的性质去模拟队列的FIFO(First in,first out 先入先出),这里可以使用一个栈作为push站,一个栈作为pop/top的访问栈;
    • 使用两个队列来实现栈,对于栈的pop或者是top,就只能是从队列中挨个把元素取出来放到另一个队列中,直到取到队底的元素,就作为栈顶的元素弹出或者访问。
  • 栈系列的经典题目
    • 括号匹配
    • 删除字符串中的所有相邻重复项
    • 后缀表达式
    • 这些题目,应该算是经典而又基础的题了,只是要注意,在使用栈的时候,要注意空栈的情况,以及什么情况下栈中的元素要出栈,什么情况下要入栈,以及要注意出栈元素的顺序和实际入栈的顺序是相反的(这在表达式那道题有所体现)
  • 优先队列
    • 这个知识点,感觉更属于堆的知识,不过是会用到队列的一些基本操作,比如push,pop,top,emplace这些
    • 滑动窗口最大值
    • 前K个高频元素
    • 这些题,基本思路比较好想到,只是会在使用pair,或者map,以及emplace()这样的函数有些生疏。

http://www.dtcms.com/a/328686.html

相关文章:

  • UnityWeb打包注意事项及与网页端通信
  • 初识c语言————排序方法
  • 【游戏开发记录】一款网游+修仙为背景的游戏
  • 美国英语 8 You‘re Going to Be Fine 早日康复
  • Dify 从入门到精通(第 32/100 篇):Dify 的日志分析与监控
  • 1688跨境寻源通API接入||跨境寻源通有哪些具体的功能和优势?
  • 反射的详解
  • CAP理论深度解析与工程实践指南
  • USB基础 -- USB2.0设备插入的过程
  • 陕西西安一家IPO四年亏损近25亿负债率攀升,控制权稳定性遭质疑
  • 力扣121:买卖股票的最佳时机
  • 100、【OS】【Nuttx】【构建】cmake 配置保存
  • Xsens惯性动作捕捉系统
  • 数据库事务隔离:详解及Java面试题
  • MyBatis-Plus 分页失效问题解析:@Param 注解的影响与解决方案
  • amis表单较验
  • Datawhale AI夏令营第三期多模态RAG方向 Task3
  • AAAI论文速递 | NEST:超图小世界网络让自动驾驶轨迹预测更精准
  • 基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算实践过程
  • 从聚合到透视:SQL 窗口函数的系统解读
  • 谷歌、facebook、tiktok广告账户多开怎么安全?亚马逊、ebay、shopee多店铺怎么做好?看看adspower工具,注册免费试用及实用技巧分享
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • 基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践
  • 4G模块 ML307A通过MQTT协议连接到阿里云
  • 数据科学与爬虫技术学习笔记
  • 基于机器学习的自动驾驶汽车新型失效运行方法
  • Win11和Mac设置环境变量
  • 【汽车标定数据】动态优先级线程池在异步多文件解析中的应用
  • 2022 年全国硕士研究生招生考试真题笔记
  • 深度学习赋能汽车制造缺陷检测