单调队列

单调队列即元素从队头到队尾单调有序的队列,为了维护单调性,在新元素入栈时,需要将队尾若干元素出栈。

通过将一个序列中所有元素依次送入单调队列,可以找到定长区间的最小/大值。

找出数组a[n]中长为k滑动窗口中最小值,此时需要维护一个单调递增的双端队列:

int a[n];
deque<int> q;

for (int i = 0; i < n; i++) {
    if (!q.empty() && i-q.front()+1 > k)
        q.pop_front();
    while (!q.empty() && a[q.back()]] >= a[i])
        q.pop_back();
    q.push_back(i);
    // 在此处获得最小值a[q.front()]
}

找出数组a[n]中长为k滑动窗口中最大值,此时需要维护一个单调递减的双端队列:

int a[n];
deque<int> q;

for (int i = 0; i < n; i++) {
    if (!q.empty() && i-q.front()+1 > k)
        q.pop_front();
    while (!q.empty() && a[q.back()]] <= a[i])
        q.pop_back();
    q.push_back(i);
    // 在此处获得最大值a[q.front()]
}

注解:单调队列严格讲是一边入队,两边出队的双端队列。