子數組最大平均數 I
給定 n 個整數,找出平均數最大且長度爲 k 的連續子數組,並輸出該最大平均數。
示例:
輸入:[1,12,-5,-6,50,3], k = 4
輸出:12.75
解釋:最大平均數 (12-5-6+50)/4 = 51/4 = 12.75
解題思路
由於是關於一個數組中子數組的求和問題,所以可以利用滑動窗口方法來解。
(1) 首先,將數組 nums[] 中的前 k 個元素求和得到 sum ,並認爲它是當前的最大值。
(2) 隨後設置一個 left 指針用來指向子數組中的第一個元素。
(3) 遍歷 nums[] 數組的後 n - k 個元素,每遍歷一次就減去 nums[] 中 left 位置上的元素並加上最新進來的元素,計算完後與之前設置的最大值進行比較,直到遍歷完所有元素。即可得到長度爲k的連續子數組的最大值。
整個過程就像是有一個能夠移動的窗口在這個數組 nums[] 上,從左至右一次移動一格。在計算時,每次都是計算當前這個窗口中的所有元素。
代碼
class Solution {
public double findMaxAverage(int[] nums, int k) {
int sum = 0;
int n = nums.length;
for (int i = 0; i < k; i++) {
//先把前k個元素全部相加
sum += nums[i];
}
int maxSum = sum;
int left = 0;//左指針--用來指向窗口中的第一個元素
//從第k個開始到數組結尾(滑動窗口)---i就相當於是指向下一個要進入窗口的元素的指針
for (int i = k; i < n; i++) {
//nums[i]爲新進入子數組的元素 nums[i-k]爲原子數組中第一個元素
sum = sum - nums[left++] + nums[i];
maxSum = Math.max(maxSum, sum);
}
return 1.0 * maxSum / k;
}
}