题意
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k。
找出平均数最大且长度为 k 的连续子数组,并输出这个最大平均数。
题目链接:643. 子数组最大平均数 I
思路
这道题是固定长度滑动窗口。
窗口大小固定为 k,所以不需要枚举所有子数组,只需要维护当前窗口的和 sum:
- 新增:右端元素
nums[i]进入窗口,累加到sum。 - 窗口未成形:当
i < k - 1时,窗口长度还不够k,直接继续。 - 更新答案:窗口长度达到
k后,用当前sum更新最大窗口和maxSum。 - 出去:减去窗口最左侧元素,让窗口准备向右滑动。
最后返回 maxSum / k。
代码
function findMaxAverage(nums: number[], k: number): number {
let sum = 0;
let maxSum = -Infinity;
for (let i = 0; i < nums.length; i++) {
// 新增
sum += nums[i];
if (i < k - 1) {
continue;
}
// 更新
maxSum = Math.max(maxSum, sum);
// 出去
let left = i - k + 1;
sum -= nums[left];
}
return maxSum / k;
};复杂度
- 时间复杂度:,每个元素最多进入和离开窗口一次。
- 空间复杂度:,只维护窗口和与最大值。