解法一:
class Solution {
public double findMaxAverage(int[] nums, int k) {
//int maxSum = Integer.MIN_VALUE; 求和的不能用与数组无关的数来赋初值
//题目中提到数组长度大于等于1
//int maxSum = nums[0];//不能用这个来判断,因为maxSum的长度一定来自于k个数
//因为1 <= k <= n <= 30,000. k <= n
int maxSum = 0;
for(int i = 0; i < k; i++){
maxSum += nums[i];
}
int thisSum = 0;
//上面做过一次了,这里就从第二组的k个数开始
for(int i = 1; i <= nums.length - k; i++){//注意判断条件是i <= nums.length - k 而不是i < nums.length - k,举个例子来判断即可
thisSum = 0;
for(int j = 0; j < k; j++){
thisSum += nums[j + i];
}
maxSum = Math.max(maxSum, thisSum);
}
return (double)(maxSum) / k;
}
}
解法二:
class Solution {
public double findMaxAverage(int[] nums, int k) {
long sum = 0;
for (int i = 0; i < k; i++)//先求出第一组的k个数的和
sum += nums[i];
long max = sum;//当前最大值
//这里用一个循环就可以搞定,用到slide window的思想,即使用两重循环,在往后移动时,中间的数也没变,变的只是首尾的数
for (int i = k; i < nums.length; i++) {
//所以只用对往后移动时首尾的改变一下,来个差值,就得到了第i组的k个数,i = 1,2,...k-i+1
//比如,第一组是0到k-1,那么第二组就是1到k,对nums[k] - nums[0]就得到了新的sum,第二组的,相当于遍历求和
//第三组又是在第二组的基础上,首尾又不同,是正确的,因为第二组就相当于是遍历求和来的,不存在没加上啥的
sum += nums[i] - nums[i - k];
max = Math.max(max, sum);
}
return max / 1.0 / k;
}
}