• 作者:老汪软件技巧
  • 发表时间:2024-09-02 11:01
  • 浏览量:

难度:简单

给你一个由 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

提示:

解题思路:

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

初始化一个变量 windowSum 为数组前 k 个元素的和,以及一个变量 maxAverage 为 windowSum / k。使用一个循环遍历数组,从第 k 个元素开始到最后一个元素。在每次迭代中,从窗口中移除最左边的元素,并将下一个元素加入窗口。计算新窗口的平均值,并更新 maxAverage。循环结束后,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)