643. 子数组最大平均数 I
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给你一个由 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
具体题目链接: 题目链接
思路:
思路:滑动窗口思路
窗口扩展时寻找可行解,窗口收缩时优化可行解
当滑动窗口可以定长时,一直维护k个长度的滑动窗口即可
当滑动窗口需要不定长时,需要通过特定条件(比如滑动窗口的总和)来判断left和right指针 到底是移动哪个
分析:
长度为 k 的连续子数组:说明滑动窗口的长度为k就可以
right-left+1 ==k
具体分析见注释
代码:
var findMaxAverage = function(nums, k) {//滑动窗口的解法
let n = nums.length;
let window = 0;
// 第 1 步:先求出第1个窗口的和
for(let i=0;i<k;i++) window += nums[i];
// 第 2 步:通过遍历求出除了第1个窗口的和
let res = window;
let right = k;
// [left..right) 是长度为k的窗口
while(right<n) {
let left = right - k;
// 加上窗口最右边的一个数,再减去窗口最左边的一个数
window = window + nums[right] - nums[left];
res = Math.max(res, window);//取最大值
right++;
}
return res/k;
};
总结:
这是算法系列文章「滑动窗口」的相关题解