主要求解固定长度区间内的最值 单调队列:是一种主要用于解决滑动窗口类问题的数据结构,即,在长度为 n 的序列中,求每个长度为 m 的区间的区间最值。它的时间复杂度是 O(n)。

基本思想

维护一个双向队列(deque),遍历序列,仅当一个元素可能成为某个区间最值时才保留它。
单调递减队列:维护区间最大值。队列存储可能的所有最大值
单调递增队列:维护区间最小值。队列存储可能的所有最小值

单调递减队列

  1. deque<int> que; // 存储区间下标
  2. int m = 4; // 子数组的长度
  3. for (int i = 0; i < n; i++) {
  4. if (!que.empty() && (i - que.front() >= m)) {
  5. que.pop_front(); // 去除过期的数据。
  6. }
  7. while (!que.empty() && (nums[que.back()] < nums[i])) {
  8. que.pop_back(); // 去除队尾所有比新数据小的数据
  9. }
  10. que.push_back(i); // 新数据入队列
  11. if (i >= m - 1) {
  12. // 此处可以根据要求处理。
  13. cout << nums[que.front()] >> " ";
  14. }
  15. }

单调递增队列

  1. deque<int> que; // 存储区间下标
  2. int m = 4; // 子数组的长度
  3. for (int i = 0; i < n; i++) {
  4. if (!que.empty() && i - que.front() >= m) {
  5. que.pop_front(); // 去除过期的数据。
  6. }
  7. while (!que.empty() && nums[que.back()] > nums[i]) {
  8. que.pop_back(); // 去除队尾所有比新数据大的数据
  9. }
  10. que.push_back(i); // 新数据入队列
  11. if (i >= m - 1) {
  12. // 此处可以根据要求处理。
  13. cout << nums[que.front()] >> " ";
  14. }
  15. }