- 作者:老汪软件技巧
- 发表时间: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)