第五章 栈与队列part02
150. 逆波兰表达式求值
本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题
题目链接/文章讲解/视频讲解:programmercarl.com/0150.%E9%80…
239. 滑动窗口最大值 (有点难度,可能代码写不出来,但一刷至少需要理解思路)
之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。
题目链接/文章讲解/视频讲解:programmercarl.com/0239.%E6%BB…
347.前 K 个高频元素 (有点难度,可能代码写不出来,一刷至少需要理解思路)
大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。
题目链接/文章讲解/视频讲解:programmercarl.com/0347.%E5%89…
总结
栈与队列做一个总结吧,加油
programmercarl.com/%E6%A0%88%E…
笔记
逆波兰表达式求值
-
初始化
- 创建一个空栈
stack用于存储操作数。
- 创建一个空栈
-
遍历
tokens数组-
对于每个
token(操作符或操作数):-
如果
token是操作符(不是数字):- 从栈中弹出两个数字(注意弹出的顺序)。
- 根据操作符进行相应的运算(
+,-,*,/)。 - 将计算结果推入栈中。
-
如果
token是数字:- 将其转换为数字类型,并推入栈中。
-
-
-
返回结果
- 最后,栈中的唯一元素即为计算结果。
滑动窗口最大值
使用单调队列(Monotonic Queue)来有效地跟踪滑动窗口中的最大值。队列中的元素保持递减顺序,使得队列的前端始终是当前窗口中的最大值。
单调队列(Monotonic Queue)
定义一个类 MonoQueue,实现以下操作:
enqueue(index):将新元素的索引添加到队列中,确保队列保持递减顺序。dequeue(index):移除滑出窗口的元素的索引。front():返回队列前端索引对应的值,即当前窗口的最大值。
-
初始化
- 创建一个
MonoQueue实例helperQueue。 - 初始化一个结果数组
resArr。 - 填充第一个长度为
k的窗口,并将其最大值添加到resArr中。
- 创建一个
-
滑动窗口
-
从第
k个元素开始,逐个滑动窗口:- 将当前元素的索引加入
helperQueue中。 - 移除滑出窗口的元素的索引(即
i - k)。 - 将当前窗口的最大值添加到
resArr中。
- 将当前元素的索引加入
-
-
返回结果
- 返回
resArr,它包含了每个窗口的最大值。
- 返回
前K个高频元素
使用了 PriorityQueue 来维护一个小顶堆,从而找出数组中出现频率最高的 k 个元素。代码的思路很清晰,先使用 Map 统计每个元素出现的频率,然后通过优先队列(小顶堆)来保持最频繁的 k 个元素。
-
使用
Map统计元素频率:- 通过遍历数组
nums,将每个元素及其出现次数存入Map。
- 通过遍历数组
-
创建小顶堆:
- 使用小顶堆来存储频率最高的
k个元素。在堆中,元素的频率越小,优先级越高(即小顶堆的堆顶是频率最小的元素)。
- 使用小顶堆来存储频率最高的
-
维护堆的大小:
- 当堆的大小超过
k时,移除堆顶元素,保证堆中只存储前k个最频繁的元素。
- 当堆的大小超过
-
输出结果:
- 将堆中剩余的元素从堆顶取出,得到频率最高的
k个元素。
- 将堆中剩余的元素从堆顶取出,得到频率最高的