滑动窗口
维护队列 满足一个单调性
找窗口中的最小值: 3 -1 -3
后边一个元素比当前元素小的话,当前元素就没用了,冗余元素 删掉。
当遍历完整个数组 所有的冗余元素都删掉了, 剩下的就是一个单调递增的序列。
具有单调性方便: 在遍历时就维护了, 取当前窗口的队头即可,就是最小值
每次 O(1)的复杂度 , 整体的复杂度就是O(n)的
- 将队列中的没有用的元素删掉一>具有 了单调性
- 可以用0(1)时间从队头/队尾取出最值
这个做法算法,稳健,可以找到当前窗口最值 或找出离他最近的比他大/小的第一个数
窗口长度为k 所以, 队头出队,队尾入队, hh = 0队头, tt = -1 队尾 a[++tt] = x;
[队头,队尾]
[i - k + 1, i ]
code:
#include <iostream>
using namespace std;
const int N = 1000010;
int a[N], q[N], hh, tt = -1;
#define IOS ios::