给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例 1:
输入: [1,12,-5,-6,50,3], k = 4
输出: 12.75
解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
注意:
1 <= k <= n <= 30,000。
所给数据范围 [-10,000,10,000]。
分析:
题解一:
直接暴力求解,每次把 k 个加起来,找出最大和,返回最大和除以 k
class Solution {
public double findMaxAverage(int[] nums, int k) {
int len = nums.length;
int max = Integer.MIN_VALUE;
for (int i = 0; i <= len - k; i++) {
int t = 0;
for (int j = i; j < i + k; j++)
t += nums[j];
max = Integer.max(max, t);
}
return max * 1.0 / k;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
题解二:
发现其实有些是重复计算了的,比如
nums[] = [1,2,3,4,5,6,7],k = 3;
第一次是 1 + 2 + 3
第二次是 2 + 3 + 4
第三次是 3 + 4 + 5
….
如果能维护一个数组,每次只加新遇见的数组值和减去末尾的数组值,就把每次 k 次的计算量减少到固定的 2 次
class Solution {
public double findMaxAverage(int[] nums, int k) {
int len = nums.length;
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i < k; i++) {
sum += nums[i];
max = sum;
}
for (int i = k; i < len; i++) {
sum += nums[i] - nums[i - k];
max = Integer.max(sum, max);
}
return max * 1.0 / k;
}
}
---------------------