AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010;
int n,k;
int a[N],q[N];
int hh,tt=-1;
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)
{
if(hh<=tt&&i-q[hh]+1>k)hh++;
while(hh<=tt&&a[i]<=a[q[tt]])tt--;
q[++tt]=i;
if(i+1-k>=0)cout<<a[q[hh]]<<" ";
}
cout<<endl;
hh=0,tt=-1;
for(int i=0;i<n;i++)
{
if(hh<=tt&&i-q[hh]+1>k)hh++;
while(hh<=tt&&a[i]>=a[q[tt]])tt--;
q[++tt]=i;
if(i+1-k>=0)cout<<a[q[hh]]<<" ";
}
return 0;
}
相关解释:
这里的话,单调队列里面的元素始终是单调的,并且前面的元素比后面的元素先遍历到,所以要判断元素是否不在窗口内了,只需每次判断对头是否在窗口内就行了,这个必须在最前面判断。