📜  至少X和最大Y大小的子数组的最大平均值(1)

📅  最后修改于: 2023-12-03 15:41:24.839000             🧑  作者: Mango

至少X和最大Y大小的子数组的最大平均值

介绍

在一个数组中,可以选取长度至少为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)
[]