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。
假定:
- N是区间[2,100000]内的整数;
- 数组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]
- 结果
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。
image image
网友评论