码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-05-04 19:26:39      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:窗口   滑动   根据   double   nbsp   idt   平均值   minus   strong   

题目:

技术图片

 

 

解答:

方法一:累计求和

为了获得长度为 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

标签:窗口   滑动   根据   double   nbsp   idt   平均值   minus   strong   

原文地址:https://www.cnblogs.com/ocpc/p/12827587.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!