You are given an integer array nums consisting of n elements, and an integer k.
Find a contiguous subarray whose length is equal to k that has the maximum average value and return this value. Any answer with a calculation error less than 10-5 will be accepted.
題目給定一個整數陣列nums以及整數k,陣列其中包含n個元素。
請在陣列中找出一個連續子數列,這個子數列的長度必須等於k值,且子數列中的所有整數數值總和平均值,必須是陣列nums中最大值。找出該連續子數列並回傳其加總平均值。回傳的平均值只要在10-5的誤差範圍內,都是可以被接受的。
要在陣列中一遍又一遍的把k範圍內的所有整數加總平均並記錄,並且比較各加總值才能找出最大值。如果使用這樣的直覺去寫pseudocode,那絕對需要兩層loop才能完成這道題目。
【Concept】
改使用Sliding Window技巧解題,首先要先定義出window的起點以及window size,那麼window的起點就會是使用for loop去迭代,window size就會是k值。只要window size滿足k值,就等於完成一次subarray的檢查,用for loop迭代逐一檢查,直到sliding window跑完整個陣列nums。
設定window size、window的起點與終點、目前平均數的最大值max、window內所有數的加總windowSum
為了排除陣列中的整數皆為負數的情況,先計算陣列中從index 0的位置加總k個整數的總合,並以此總合做為當前最大的總合值max
使用for loop跑整個nums
3-1. 利用windowSum計算sliding window裡面所有整數的總合
3-2. 如果window size等於k,表示可以進行總合最大值的判斷
3-2-1. 比較windowSum與sum,若windowSum比max大,則更新max的值
3-2-2. 走到這步表示已經完成k的加總,sliding window可以往右移動,所以要先把sliding window中最左邊的整數減掉
3-2-3. 移動sliding window的起點start
完成以上的步驟,取得最大值max,計算平均後回傳
解題
var findMaxAverage = function(nums, k) {
let windowSum = 0;
let start = 0;
let max = 0;
for (let i = 0; i < k; i++){
max += nums[i];
}
for (end = 0; end< nums.length; end++){
windowSum += nums[end];
if ((end - start + 1) == k){
max = Math.max(max, windowSum);
windowSum -= nums[start];
start++;
}
}
return max / k;
};