滑动窗口

题目描述

现在有一堆数字共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
%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("
");
    for(i=1;i<=r;i++){
        printf("%d ",f[i].y);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/hrj1/p/11223363.html