滑动窗口
-
主要思想:单调队列 保证队列中下标跨度始终为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时窗口大小>3 q[++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; }
-