重练算法(代码随想录版) 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/

posted @ 2025-11-15 17:07  GengarF  阅读(1)  评论(0)    收藏  举报