看过单调栈过后,我们再看看单调队列
栈的性质:先进先出
类似于排队在食堂打饭(这个比喻好形象)
单调队列和单调栈一样,满足某种单调性质的队列。(递增,递减)
洛谷题:https://www.luogu.com.cn/problem/P1886
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N],q[N],tt,hh;
int n,k;
int main()
{
hh = 0,tt =-1;
scanf("%d%d",&n,&k);
for(int i =0;i<n;i++)scanf("%d",&a[i]);
for(int i =0;i<n;i++)
{
if(hh<=tt && i-k+1>q[hh])hh++;//判断队头是否滑出窗口
while(hh<=tt && a[q[tt]]>a[i])tt--;
q[++tt]=i;
if(i-k+1>=0) printf("%d ",a[q[hh]]);
}
puts("");
hh=0,tt=-1;
for(int i =0;i<n;i++)
{
if(hh<=tt && i-k+1>q[hh])hh++;
while(hh<=tt && a[q[tt]]<a[i])tt--;
q[++tt]=i;
if(i-k+1>=0) printf("%d ",a[q[hh]]);
}
return 0;
}
注意:q[ N ] 中存的是下标
第一部分:求出滑动窗口的最小值
我们维护一个递增的队列,保证队头元素最小
第二部分:求出滑动窗口的最大值
我们维护一个递减的队列,保证队头元素最大
这个时候一定有人会问:为什么队列要存下标,而不直接存数
这个地方一开始我也不是很明白,但是知道模拟一下,就会发现,窗口的每一次滑动,不代表队头都要出队,而队头什么时候出队就成了一个问题。
二q[ N ] 中存下标,就完美的解决了这个问题。