643. 子数组最大平均数 I Easy
给你一个由 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,在遍历数组的过程中维护当前窗口的总和,并计算其平均值。每次窗口右移时,只需要减去左边移出元素的值,加上右边新进入元素的值,即可在 O(1) 时间内更新窗口和。
同时,用一个变量记录当前遇到的最大平均值,遍历结束后即可得到最终答案
代码实现
python
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
window_sum = 0 # 初始化滑动窗口内的元素和
# 计算第一个长度为 k 的窗口的总和
for i in range(0, k):
window_sum += nums[i]
# 初始化最大平均值
max_value = window_sum / k
# 从第 k 个元素开始,滑动窗口
for i in range(k, len(nums)):
# 从窗口左边移除一个数(nums[i - k]),右边加入一个新数(nums[i])
diff = nums[i] - nums[i - k]
window_sum += diff # 更新窗口和
# 计算当前窗口的平均值,并更新最大值
max_value = max(max_value, window_sum / k)
return max_value # 返回最大平均值
javascript
const findMaxAverage = function (nums, k) {
let windowSum = 0;
// 先计算第一个窗口的总和(前 k 个数)
for (let i = 0; i < k; i++) {
windowSum += nums[i];
}
// 初始最大平均值就是第一个窗口的平均值
let maxValue = windowSum / k;
// 滑动窗口,从第 k 个数开始往后遍历
for (let i = k; i < nums.length; i++) {
// 当前窗口 = 上一个窗口 + 新进元素 - 滑出元素
const diff = nums[i] - nums[i - k];
// 更新当前窗口的和
windowSum += diff;
// 更新最大平均值
maxValue = Math.max(maxValue, windowSum / k);
}
// 返回最大平均值
return maxValue;
}
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)