代码随想录刷题记录 5 - 栈和队列

记一下刷到哪了,推:代码随想录

5. 栈和队列

难度题目类型 ( 空间 + 时间复杂度 )
简单232. 用栈实现队列
简单225. 用队列实现栈
简单20. 有效的括号栈 O(n)+O(n)
简单1047. 删除字符串中的所有相邻重复项栈 O(n)+O(n)
中等150. 逆波兰表达式求值栈 O(1)+O(n)
中等239. 滑动窗口最大值(√)单调队列 O(k)+O(n)
中等347.前 K 个高频元素(√)map O(n)+O(n)
中等71. 简化路径栈 O(n)+O(n)

总结:239 和 347 比较有意思。(曾经觉得很复杂的东西,现在发现没有那么难了。)

239. 滑动窗口最大值

方法1. 优先队列

使用优先队列记录维持窗口中的元素,对元素计数。
当 i > k时,将优先队列的 top 取出,若 top 的数量为 0,删除,将计数不为0的 top 加入答案中。
将当前元素加入优先队列中,计数++;

方法2. 单调队列

维护一个不增的单调队列,队列中存储元素的下标,表示对结果有用的元素。
当 i > k时,将队头下标的元素加入答案中,若下标 == i-k (滑动时出去的元素),则删除队头元素。
将当前元素加入优先队列中,维持不增的单调性;

347.前 K 个高频元素

方法1. 优先队列

首先使用 map 对每个出现的数字 计数。
使用优先队列 Q(小根堆)维持 k 个元素,堆的大小 < k 的时候,就一直添加元素和出现次数(根据数量排序)。
当 大小 >= k时,将优先队列的 top 取出,若 top 的数量小于当前的数量,删除,将当前的加入 Q 中。
结果就是优先队列 Q 里面的 k 个元素

方法2. 二次计数

首先使用 map1 对每个出现的数字 计数。
使用 map2 对次数再次计数,
从大到小遍历 map2,保留前 k 个元素。
时间:O(n)

Tips

1.优先队列 priority_queueQ; 默认是大根堆。
2.逆向遍历容器:从 rbegin() 到 rend(),写法与begin() end()相同,作用正好相反。
方法:rbegin();
解释:rbegin()返回一个逆向迭代器,指向字符串的最后一个字符。
方法:rend();
解释:rend()函数返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值