单调队列即元素从队头到队尾单调有序的队列,为了维护单调性,在新元素入栈时,需要将队尾若干元素出栈。
通过将一个序列中所有元素依次送入单调队列,可以找到定长区间的最小/大值。
找出数组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()]
}
注解:单调队列严格讲是一边入队,两边出队的双端队列。