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

4734220-29a9fb858ca70604.png
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]
  • 结果
4734220-bd6aeb9ab3cc4215
image

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

4734220-3a38d3c2af6073bb
image
4734220-28f0bd9ed8f73937
image

猜你喜欢

转载自blog.csdn.net/weixin_33937913/article/details/86815330