AcWing 154. 滑動視窗
阿新 • • 發佈:2020-07-29
AcWing 154. 滑動視窗
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int n,k; //q是佇列 int a[N],q[N]; int main(){ scanf("%d%d",&n,&k); //初始化佇列 int hh=0,tt=-1; for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) { //判斷隊頭是否已經滑出視窗 //終點是i,起點是i-k+1,如果>q[hh],說明q[hh]已經滑出視窗 //視窗每次只滑動一位,所以用if不用while if(hh<=tt&&i-k+1>q[hh]) hh++; //如果新插入的數,比隊尾的數要小或者相等的話,隊尾就沒有用了,可以刪掉 while(hh<=tt&&a[q[tt]]>=a[i]) tt--; //在佇列中插入新插入數的座標 q[++tt]=i; //從前k個數開始輸出,不足k個數,不需要輸出 if(i>=k-1) printf("%d ",a[q[hh]]); } printf("\n"); //初始化佇列 hh=0,tt=-1; for(int i=0;i<n;i++) { //判斷隊頭是否已經滑出視窗 //終點是i,起點是i-k+1,如果>q[hh],說明q[hh]已經滑出視窗 //視窗每次只滑動一位,所以用if不用while if(hh<=tt&&i-k+1>q[hh]) hh++; //如果新插入的數,比隊尾的數要大或者相等的話,隊尾就沒有用了,可以刪掉 while(hh<=tt&&a[q[tt]]<=a[i]) tt--; //在佇列中插入新插入數的座標 q[++tt]=i; //從前k個數開始輸出,不足k個數,不需要輸出 if(i>=k-1) printf("%d ",a[q[hh]]); } return 0; }