题意

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k

找出平均数最大且长度为 k 的连续子数组,并输出这个最大平均数。

题目链接:643. 子数组最大平均数 I

思路

这道题是固定长度滑动窗口。

窗口大小固定为 k,所以不需要枚举所有子数组,只需要维护当前窗口的和 sum

  1. 新增:右端元素 nums[i] 进入窗口,累加到 sum
  2. 窗口未成形:当 i < k - 1 时,窗口长度还不够 k,直接继续。
  3. 更新答案:窗口长度达到 k 后,用当前 sum 更新最大窗口和 maxSum
  4. 出去:减去窗口最左侧元素,让窗口准备向右滑动。

最后返回 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;
};

复杂度

  • 时间复杂度:,每个元素最多进入和离开窗口一次。
  • 空间复杂度:,只维护窗口和与最大值。