重练算法(代码随想录版) day11 - 栈与队列part2
今日刷题量:4
当前刷题总量:53
Easy: 30
Mid: 21
Hard: 2
Day
解题思想
1.单调队列,用deque去实现,因为queue在没有指定容器的情况下,deque就是默认底层容器。
- 设计单调队列的时候,pop,和push操作要保持如下规则:
- pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
- push(value):如果push的元素value(< 或 >)入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值(>= 或 <=)队列入口元素的数值为止
- 保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最小/最大值。
以上单调队列实现的方式仅供参考,具体题目有所差别,借鉴思想即可
2.优先级队列,最大堆/最小堆
优先队列的模版原型如下:
点击查看代码
template<
class T, // 存储的类型
class Container = vector<T>, // 底层容器
class Compare = less<T> // 比较器(决定大根堆还是小根堆)
> class priority_queue;
- priority_queue默认最大堆
priority_queue<T> maxHeap; // 默认大顶堆 - 改成最小堆的方式,利用std::greater
priority_queue<T, Container<T>, greater<T>> minHeap;
| 名称 | 逻辑 | 用途 |
|---|---|---|
std::less<T> |
a < b |
默认比较方式,构成 大顶堆、升序 |
std::greater<T> |
a > b |
用于构造 小顶堆、降序 |
- 但是默认比较器只能比较元素本身的大小,如果碰到比较元素为诸如pair<T, T>, 需要以第二个元素来比较,比较器还是需要自己定义:
- 以pair<int, int>, 存储容器为vector为例, 比较器cmp借助lambda表达式写:
- 最大堆写法:
点击查看代码
auto cmp = [](const pair<int,int>& a, const pair<int,int>& b) {
return a.second > b.second;
};
priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(cmp)> minHeap(cmp);
- 最小堆修改cmp中的比较逻辑改为<即可。
练习题目
150. 逆波兰表达式求值(mid):https://leetcode.cn/problems/evaluate-reverse-polish-notation/
239. 滑动窗口最大值 (hard):https://leetcode.cn/problems/sliding-window-maximum/
347.前K个高频元素(mid):https://leetcode.cn/problems/top-k-frequent-elements/
71. 简化路径(mid):https://leetcode.cn/problems/simplify-path/

浙公网安备 33010602011771号