131.Maximum Average Subarray I
题目:
Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value.
给定由n个整数组成的数组,找到具有最大平均值的给定长度k的连续子阵列。 您需要输出最大平均值。
Example 1:
Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation: Maximum average is (12-5-6+50)/4 = 51/4 = 12.75
Note:
- 1 <= k <= n <= 30,000.
- Elements of the given array will be in the range [-10,000, 10,000].
解答:
方法一:累加数组
1 class Solution { 2 public double findMaxAverage(int[] nums, int k) { 3 int n=nums.length; 4 int[] sums=nums; 5 for(int i=1;i<n;i++) 6 sums[i]=sums[i-1]+nums[i]; 7 int maxSum=sums[k-1]; 8 for(int i=k;i<n;i++) 9 maxSum=Math.max(maxSum,sums[i]-sums[i-k]); 10 return (double)maxSum/k; 11 } 12 }
方法二:滑动窗口
1 class Solution { 2 public double findMaxAverage(int[] nums, int k) { 3 int sum=0; 4 for(int i=0;i<k;i++) 5 sum+=nums[i]; 6 int maxSum=sum; 7 for(int i=k;i<nums.length;i++){ 8 sum+=nums[i]-nums[i-k]; 9 maxSum=Math.max(maxSum,sum); 10 } 11 return (double)maxSum/k; 12 } 13 }
详解:
方法一:
计算子数组之和最常用的是建立累加数组,可以算出任意长度为k的数组,求得最大的即可
nums:1,12,-5,-6,50,3
sums:1,13,8,2,52,55
maxSum=sums[3]=2
sums[4]-sums[0]=51
sums[5]-sums[1]=42
maxSum=sums[4]-sums[0]=51
方法二:
因此题给出k,先计算前k个数字之和,将窗口向右移动一位,减去左边数字,加上右边数字,计算新和,留下较大的结果,最后除以k即为最大的均值