• 滑动窗口


    题目描述

    现在有一堆数字共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;
    }
  • 相关阅读:
    Android 架构:Android Jetpack 架构组件的学习和分析
    Android 看源码学 Binder
    Android Okhttp 源码分析(待完成)
    Android Glide 源码分析系列(待完成)
    界面2
    使用spring 4.0 + maven 构建超简单的web项目
    maven中跳过单元测试
    Hibernate+maven+eclipse 实现自动建表
    android开发学习---开发一个简易的短信发送器
    java面试题--实现一个百亿的计算器
  • 原文地址:https://www.cnblogs.com/hrj1/p/11223363.html
Copyright © 2020-2023  润新知