滑动窗口
-
主要思想:单调队列 保证队列中下标跨度始终为3个数
-
- q[N]维护数组中元素下标 方便判断窗口大小
-
#include<iostream>#include<algorithm>using namespace std;const int N=1000010;int a[N],q[N];int n,k,hh,tt=-1;int main(){cin>>n>>k;for(int i=0;i<n;i++){scanf("%d", &a[i]);}for(int i=0;i<n;i++){while(hh<=tt && a[q[tt]]>=a[i]) tt--; //队列非空 并且 新元素更优if(hh<=tt && q[hh] < i-k+1) hh++; //q[hh]为左端点下标 <i-k+1时窗口大小>3q[++tt] = i; //将当前新元素下标保存if(i>=k-1) cout<<a[q[hh]]<<" "; //从k+1往后 每一次都输出最小值}cout<<endl;hh=0,tt=-1;for(int i=0;i<n;i++){//只有这里有变动 <= while(hh<=tt && a[q[tt]]<=a[i]) tt--;if(hh<=tt && q[hh] < i-k+1) hh++;q[++tt] = i;if(i>=k-1) cout<<a[q[hh]]<<" ";}cout<<endl;}
-