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. 1 <= k <= n <= 30,000.
  2. 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即为最大的均值

posted @ 2018-09-03 14:51  chan_ai_chao  阅读(89)  评论(0编辑  收藏  举报