【一看就会一写就废 指间算法】子数组最大平均数 I —— 滑动窗口、数组

38 阅读1分钟

指尖划过的轨迹,藏着最细腻的答案~

题目:

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10510^{-5} 的答案都将被视为正确答案。

示例 1:

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (1256+50)/4=51/4=12.75(12 - 5 - 6 + 50)/4 = 51/4 = 12.75

示例 2:

输入:nums = [5], k = 1
输出:5.00000

提示:

n==nums.lengthn == nums.length
1<=k<=n<=1051 <= k <= n <= 10^5
104<=nums[i]<=104-10^4 <= nums[i] <= 10^4

分析:

本题所找的最大平均数,即是最大连续子数组的和。相当于从前k个元素开始,每次最前面丢掉一个,最后面增加一个,在这个过程中统计窗口k中的数字之和,这就是定长滑动窗口:窗口大小不变,恒定为k。 具体的由于本题有负数,因此我们可以将第一窗口的和初始化为统计的最大值ans,然后在遍历剩余的数字,更新最大值ans

**注意:**在最终计算平均值时,我们需要注意小数的处理,直接除以k会导致精度偏移,因此我们需要使用static_cast转换成double类型。

AC代码:

class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int ans = 0, sum = 0;
        for (int i = 0; i < k; i++) {
            ans += nums[i];
        }
        sum = ans;
        for (int i = k; i < nums.size(); i++) {
            sum -= nums[i - k];
            sum += nums[i];
            ans = max(ans, sum);
        }

        return static_cast<double>(ans) / k;
    }
};