【算法】子数组最大平均数 I

212 阅读2分钟

难度:简单

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

请你找出平均数最大且 长度为 **k** 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案。

示例 1:

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

示例 2:

输入:nums = [5], k = 1
输出:5.00000

提示:

  • n == nums.length
  • 1 <= k <= n <= 105
  • -104 <= nums[i] <= 104

解题思路:

我们需要找到长度为 k 的连续子数组,使得其平均值最大。滑动窗口可以帮助我们在常数时间内计算每个长度为 k 的子数组的和,从而计算出平均值。

  1. 初始化一个变量 windowSum 为数组前 k 个元素的和,以及一个变量 maxAveragewindowSum / k
  2. 使用一个循环遍历数组,从第 k 个元素开始到最后一个元素。
  3. 在每次迭代中,从窗口中移除最左边的元素,并将下一个元素加入窗口。
  4. 计算新窗口的平均值,并更新 maxAverage
  5. 循环结束后,maxAverage 即为所求的最大平均值。

JavaScript实现:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findMaxAverage = function(nums, k) {
  let windowSum = 0;
  let maxAverage = -Infinity;

  // 计算初始窗口的和
  for (let i = 0; i < k; i++) {
    windowSum += nums[i];
  }

  maxAverage = windowSum / k;

  // 使用滑动窗口计算后续窗口的和
  for (let i = k; i < nums.length; i++) {
    windowSum += nums[i] - nums[i - k]; // 添加右边元素,移除左边元素
    maxAverage = Math.max(maxAverage, windowSum / k);
  }

  return maxAverage;
};

// 示例
// const nums = [1, 12, -5, -6, 50, 3];
// const k = 4;
// console.log(findMaxAverage(nums, k)); // 输出: 12.75

这种方法只需要一次遍历,时间复杂度为 O(n),空间复杂度为 O(1)