643. 子数组最大平均数 I

214 阅读1分钟

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;
};

总结:

这是算法系列文章「滑动窗口」的相关题解