标签:窗口 滑动 根据 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 };
标签:窗口 滑动 根据 double nbsp idt 平均值 minus strong
原文地址:https://www.cnblogs.com/ocpc/p/12827587.html