📅  最后修改于: 2023-12-03 15:41:24.839000             🧑  作者: Mango
在一个数组中,可以选取长度至少为X的多个子数组,求取其中平均值最大的子数组的平均值。若所有子数组的长度都大于等于Y,则最终结果的计算上限为其中平均值最大的Y个子数组平均数。
用一个变量track记录数组中最小的数字,用一个变量sum记录从第0位开始长度为X-1的子数组的总和。在数组中依次遍历,若遇到比track更大的数字,则更新track,并将下标归零,重新计算sum。如果当前的下标大于等于X-1,则计算当前X位子数组的平均值,并将它与已知的最大值进行比较,若大于最大值,则更新最大值。当所有的长度为至少X的子数组计算完毕后,将它们按平均值进行排序,输出平均值最大的Y个子数组的平均数。如果所有子数组的长度都不足X,则返回空数组。
时间复杂度:O(nlogn),其中n为数组的长度。
from typing import List
def max_avg(nums: List[int], X: int, Y: int) -> List[float]:
if len(nums) < X:
return []
track = nums[0]
L = len(nums)
res = float('-inf')
temp_sum = sum(nums[0:X-1])
for i in range(X-1, L):
temp_sum += nums[i]
curr_avg = temp_sum / X
res = max(res, curr_avg)
if nums[i] > track:
track = nums[i]
temp_sum = sum(nums[i-X+1:i+1])
if L < Y:
Y = L
sorted_nums = sorted([(res - nums[i], i-X+1) for i in range(X-1, L)], reverse=True)
result = []
for i in range(Y):
avg = sum(nums[sorted_nums[i][1]:sorted_nums[i][1]+X]) / X
result.append(avg)
return result
>>> max_avg([1,12,-5,-6,50,3], 4, 1)
[12.75]
>>> max_avg([1,12,-5,-6,50,3], 4, 2)
[12.75, 12.166666666666666]
>>> max_avg([1,12,-5,-6,50,3], 6, 2)
[]