算法1
思路:这个题整体思路就是把队列中元素通过for循环,维持一个单调性,容易出错的地方就是需要在第二次循环前,重置队头和队尾
C++ 代码
#include<iostream>
using namespace std;
const int N=1000010;
int n,k;
int a[N],q[N];
int hh=0,tt=-1;
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
if(i-k+1>q[hh])++hh;//队首出窗口,hh++,感觉这步还是挺难理解的
while(hh<=tt &&a[i]<=a[q[tt]])--tt;//把队列中元素保持递增
q[++tt]=i;//下标加到队尾
if(i+1>=k)printf("%d ",a[q[hh]]);//输出队列中第一个数
}
cout<<endl;
hh=0,tt=-1;//OMG,这里忘了重置,找bug找死了
for(int i=0;i<n;i++)
{
if(i-k+1>q[hh])++hh;//队首出窗口,hh++,感觉这步还是挺难理解的
while(hh<=tt &&a[i]>=a[q[tt]])--tt;//把队列中元素保持递增
q[++tt]=i;//下标加到队尾
if(i+1>=k)printf("%d ",a[q[hh]]);//输出队列中第一个数
}
return 0;
}