1. 程式人生 > 實用技巧 >AcWing 154. 滑動視窗

AcWing 154. 滑動視窗

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;
}