Codility每周一课:L5 Prefix Sums(P5.3

作者: AiFany | 来源:发表于2019-01-26 16:45 被阅读2次
    0.png

    P5.3 MinAvgTwoSlice
    Find the minimal average of any slice containing at least two elements.

    • P5.3 切片的最小均值
      找出至少包含2个元素的切片的最小均值

    一个由N个整数组成的非空数组A。对于一对整数(P, Q),如有0≤P<Q<N,称为数组A的切片(切片至少包含两个元素)。 切片(P, Q)的平均值是A[P] + A[P + 1] + ... + A[Q]除以切片长度。精确地说,平均值等于(A[P] + A[P + 1] + ... + A[Q]) / (Q − P + 1).。

    例如,数组A: A[0] = 4,A[1] = 2,A[2] = 2,A[3] = 5,A[4] = 1,A[5] = 5,A[6] = 8,对于下面的切片:

    切片(1,2)的平均值:(2+2)/2=2;
    切片(3,4)的平均值:(5+1)/2=3;
    切片(1,4)的平均值:(2+2+5+1)/4=2.5;

    目标是找到平均值最小的切片的起始位置。

    编写函数:

    def solution(A)
    

    给定一个由N个整数组成的非空数组A,则返回具有最小平均值的切片的起始位置。如果有多个切片具有最小平均值,则应返回此类切片的最小起始位置。

    例如,针对上面给出的数组,函数应该返回1。

    假定:

    1. N是区间[2,100000]内的整数;
    2. 数组A的每个元素都是区间[-10000,10000]内的整数;
    • 解题思路

    只需要比较当前值与后1项组成的切片的均值,以及与后2项组成的切片的均值,两者的大小即可。用字典存储,同样的均值便不再存储。然后在字典中选择较小的均值对应的索引。

    • Python3代码
    # -*- coding:utf-8 -*-
    # &Author  AnFany
    # Lesson 5:Prefix Sums
    # P 5.3 MinAvgTwoSlice
    
    
    
    def solution(A):
        """
        寻找所有切片中具有最小均值的起始位置,时间复杂度O(N)
        :param A: 数组
        :return: 起始位置
        """
        avg_dict = {}
        for index, value in enumerate(A[:-1]):
            avg1 = (value + A[index + 1]) / 2
            try:
                avg2 = (value + A[index+1] + A[index+2]) / 3
                min_avg = min(avg1, avg2)
                if min_avg not in avg_dict:
                    avg_dict[min_avg] = index
            except IndexError:
                if avg1 not in avg_dict:
                    avg_dict[avg1] = index
    
        return min(avg_dict.items(), key=lambda x: x[0])[1]
    
    • 结果
    image

    点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

    image image

    相关文章

      网友评论

        本文标题:Codility每周一课:L5 Prefix Sums(P5.3

        本文链接:https://www.haomeiwen.com/subject/ijbijqtx.html