此题解采用了滑动窗口的方法来寻找具有最大平均值的长度为 k 的子数组。首先,如果数组的长度 n 等于 k,直接返回整个数组的平均值。否则,首先计算前 k 个元素的和作为初始的子数组和。然后,使用一个循环,通过从当前子数组和中减去最左边的元素并加上紧随其后的下一个元素来更新子数组的和,从而向右滑动窗口。每次更新后,如果发现更大的子数组和,则更新最终的最大和。最后,返回最大和除以 k 得到的结果。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
n = len(nums)
# 如果 n 等于 k,则直接返回整个数组的平均值
if n == k:
return sum(nums) / k
# 初始化滑动窗口的和
fin_ans = sum(nums[0:k])
tmp_ans = fin_ans
# 滑动窗口,计算每个长度为 k 的子数组的和
for former, latter in zip(nums[0:n-k], nums[k:n]):
tmp_ans = tmp_ans - former + latter
# 更新找到的最大子数组和
if fin_ans < tmp_ans:
fin_ans = tmp_ans
# 返回最大平均值
return fin_ans / k