• 拼多多服务端实习生笔试-滑动窗口2018/4/3


    有一整数数组A[n],滑动窗口大小为k,在A上从左到右移动,每次一步,求此过程中每步的子数组的最大值与最小值的差值

    eg:

    数组A=1 3 -1 -3 5 3 6 7      k=3

    滑动窗口的位置                           最大值               最小值                    差值

    [1 3 -1 -3] 5 3 6 7                              3                       -1                          4

    1 [3 -1 -3] 5 3 6 7                              3                       -3                          6

    1 3[ -1 -3 5 ]3 6 7                              5                       -3                          8

    ....

    输入:
    第一行:n  k     n代表数组A的长度,k代表滑动窗口大小

    第二行:n个整数,即为A数组

    输出:包含n-k+1个整数,表示每步的子数组的最大值与最小值的差值

    样例:

    输入

    8 3

    1 3 -1 -3 5 3 6 7

    输出

    4 6 8 8 3 4

    两种语言,方法相同

    C++(没有提交,不确定会不会超时)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    int a[100005];
    int main()
    {
        int n,k;
        int maxs,mins;
        while(scanf("%d%d",&n,&k))
        {
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&a[i]);
            }
            maxs=a[1];
            mins=a[1];
            for(int j=2; j<=k; j++)
            {
                if(a[j]>maxs)
                    maxs=a[j];
                if(a[j]<mins)
                    mins=a[j];
            }
            printf("%d",maxs-mins);
            for(int i=k+1; i<=n; i++)
            {
                if(a[i-k]==maxs||a[i-k]==mins)
                {
                    maxs=a[i-k+1];
                    mins=a[i-k+1];
                    for(int j=i-k+2; j<=i; j++)
                    {
                        if(a[j]>maxs)
                            maxs=a[j];
                        if(a[j]<mins)
                            mins=a[j];
                    }
                }
                else
                {
                    if(a[i]>maxs)
                    {
                        maxs=a[i];
                    }
                    if(a[i]<mins)
                    {
                        mins=a[i];
                    }
                }
                printf(" %d",maxs-mins);
            } 
            printf("
    ");
        }
        return 0;
    }

    python3(AC)

    n_k = input()
    n,k = map(int,n_k.split(' '))
    data = input()
    _list = list(map(int,data.split(' ')))
    anslist = []
    slide = _list[0:k]
    _max = max(slide)
    _min = min(slide)
    anslist.append(_max-_min)
    for poi in range(n-k):
        if _list[poi] == _max:
            _max = max(_list[poi+1:poi+k+1])
            _min = min(_min,_list[poi+k])
        elif _list[poi] == _min:
            _min = min(_list[poi+1:poi+k+1])
            _max = max(_max,_list[poi+k])
        else:
            _max = max(_max,_list[poi+k])
            _min = min(_min,_list[poi+k])
        anslist.append(_max-_min)
    print(' '.join(map(str,anslist)))
  • 相关阅读:
    Centos7.2升级内核至3.10.0-957【转】
    部署一套完整的Kubernetes高可用集群(上)【转】
    Nginx配置中一个不起眼字符"/"的巨大作用,失之毫厘谬以千里【转】
    使用vmware搭建k8s集群【转】
    nginx的request body日志格式配置
    nginx漏洞修复:SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱【原理扫描】【转】
    nginx:[warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    linux系统删除分区
    Linux用户锁定、解锁及锁定查看
    innobackupex远程备份【转】
  • 原文地址:https://www.cnblogs.com/dshn/p/8711213.html
Copyright © 2020-2023  润新知