数组643. 子数组最大平均数 I

Posted ocpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组643. 子数组最大平均数 I相关的知识,希望对你有一定的参考价值。

题目:

技术图片

 

 

解答:

方法一:累计求和

为了获得长度为 kk 的子数组的平均值,我们需要知道这 kk 个元素之和。使用 sumsum 记录数组的累加和,sum[i]sum[i] 存储从第一个元素到第 ii 个元素之和。该数组只需要计算一次。

在数组 sumsum 中,原数组索引从 ii 到 i+ki+k 的元素之和为 sum[i] - sum[i-k]sum[i]−sum[i−k]。按照此方法遍历数组 sumsum,计算每个长度为 kk 的子数组平均值,即可获得长度为 kk 的子数组的最大平均值。

public class Solution {
    public double findMaxAverage(int[] nums, int k) {
        int[] sum = new int[nums.length];
        sum[0] = nums[0];
        for (int i = 1; i < nums.length; i++)
        sum[i] = sum[i - 1] + nums[i];
        double res = sum[k - 1] * 1.0 / k;
        for (int i = k; i < nums.length; i++) {
            res = Math.max(res, (sum[i] - sum[i - k]) * 1.0 / k);
        }
        return res;
    }
}

 

方法二:滑动窗口

相比于创建一个累加和数组,再遍历计算最大平均值,本方法只需要遍历一次数组 num,从中找出长度为 k的子数组最大和。

假设我们已经索引从 i到 i+k子数组和为 x。要知道索引从 i+1 到 i+k+1子数组和,只需要从 x减去 sum[i],加上 sum[i+k+1]即可。 根据此方法可以获得长度为 k的子数组最大平均值。

 1 class Solution {
 2 public:
 3     double findMaxAverage(vector<int>& nums, int k) 
 4     {
 5         double sum=0;
 6         for(int i=0;i<k;i++)
 7         {
 8             sum+=nums[i];
 9         }
10 
11         double res=sum;
12         for(int i=k;i<nums.size();i++)
13         {
14             sum += nums[i] - nums[i-k];
15             res = std::max(res,sum);
16         }
17         return res/k;
18     }
19 };

 

以上是关于数组643. 子数组最大平均数 I的主要内容,如果未能解决你的问题,请参考以下文章

数组643. 子数组最大平均数 I

Leetcode 643.子数组最大平均数I

leetcode 643. 子数组最大平均数 I ------滑动窗口篇六,前缀和篇二

解题报告Leecode 643. 子数组最大平均数 I——Leecode 刷题系列

解题报告Leecode 643. 子数组最大平均数 I——Leecode 刷题系列

643. Maximum Average Subarray I 最大子数组的平均值