滑動窗口


題目描述

現在有一堆數字共N個數字(N<=10^6),以及一個大小為k的窗口。現在這個從左邊開始向右滑動,每次滑動一個單位,求出每次滑動后窗口中的最大值和最小值。

例如:

The array is [1 3 -1 -3 5 3 6 7], and k = 3.

輸入格式

輸入一共有兩行,第一行為n,k。

第二行為n個數(<INT_MAX).

輸出格式

輸出共兩行,第一行為每次窗口滑動的最小值

第二行為每次窗口滑動的最大值

輸入輸出樣例

輸入 #1
8 3
1 3 -1 -3 5 3 6 7
輸出 #1
-1 -3 -3 -3 3 3
3 3 5 5 6 7

說明/提示

50%的數據,n<=10^5

100%的數據,n<=10^6

 

 

大模擬。。。。。。

 

#include<cstdio>
using namespace std;

int n,k,a[1000005],i,j,ans1=-2147483647,ans2=2147483647;

struct node{
    int x,y;
}f[1000005];

inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-'){
            w=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*w;
}

int main(){
    int r=0;
    n=read();
    k=read();
    for(i=1;i<=n;i++){
        a[i]=read();
    }
    if(k>=n){
        for(i=1;i<=n;i++){
            if(a[i]>ans1){
                ans1=a[i];
            }
            if(a[i]<ans2){
                ans2=a[i];
            }
        }
        printf("%d\n%d",ans2,ans1);
        return 0;
    }
    for(i=1;i<=k;i++){
        if(a[i]>ans1){
            ans1=a[i];
        }
        if(a[i]<ans2){
            ans2=a[i];
        }
    }
    f[++r].x=ans2;
    f[r].y=ans1;
    for(i=2;i+k-1<=n;i++){
        r+=1;
        f[r].x=f[r-1].x;
        f[r].y=f[r-1].y;
        if(a[i-1]==f[r].x){
            f[r].x=2147483647;
            for(j=i;j<=i+k-1;j++){
                if(a[j]<f[r].x){
                    f[r].x=a[j];
                }
            }
        }
        if(a[i-1]==f[r].y){
            f[r].y=-2147483647;
            for(j=i;j<=i+k-1;j++){
                if(a[j]>f[r].y){
                    f[r].y=a[j];
                }
            }
        }
        if(a[i+k-1]<f[r].x){
            f[r].x=a[i+k-1];
        }
        if(a[i+k-1]>f[r].y){
            f[r].y=a[i+k-1];
        }
    }
    for(i=1;i<=r;i++){
        printf("%d ",f[i].x);
    }
    printf("\n");
    for(i=1;i<=r;i++){
        printf("%d ",f[i].y);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM