1 问题
给你一个由 n
个元素组成的整数
数组 nums
和一个整数 k
。
请你找出平均数最大
且 长度为 k
的连续子数组
,并输出该最大平均数
。
任何误差小于 $10^{-5}$ 的答案都将被视为正确答案。
示例 1
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
示例 2
输入:nums = [5], k = 1
输出:5.00000
提示:
- n == nums.length
- 1 <= k <= n <= 105
- -104 <= nums[i] <= 104
2 解题思路
2.1 滑动窗口
套用模板:
初始化将滑动窗口压满,取得第一个滑动窗口的目标值
继续滑动窗口,每往前滑动一次,需要删除一个和添加一个元素
3 代码
class Solution {
//一种写法
public double findMaxAverage(int[] nums, int k) {
int len = nums.length;
int left = 0;
int right = 0;
int maxAvg = Integer.MIN_VALUE;
int sum = 0;
while (right < len) {
if (right < k) {
sum += nums[right];
right++;
continue;
}
maxAvg = Math.max(maxAvg, sum);
sum += nums[right++] - nums[left++];
}
//right已经越界了,再次计算下(还有就是只有一个元素的情况,上述循环可能不走if的下一段程序)
return Math.max(maxAvg, sum) * 1.0 / k;
}
//模板公式写法
//按照三叶姐姐的模板写下:
//初始化将滑动窗口压满,取得第一个滑动窗口的目标值
// 继续滑动窗口,每往前滑动一次,需要删除一个和添加一个元素
public double findMaxAverage2(int[] nums, int k) {
int maxSum = Integer.MIN_VALUE;
int sum = 0;
//初始化窗口
for (int i = 0; i < k; i++) {
sum += nums[i];
}
//滑动
for (int j = k; j < nums.length; j++) {
if (sum > maxSum) {
maxSum = sum;
}
sum += nums[j] - nums[j - k];
}
return Math.max(maxSum, sum) * 1.0 / k;
}
}