iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

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才能完成這道題目。
https://ithelp.ithome.com.tw/upload/images/20240821/20168667jXH5QINfJ6.png


【Concept】
改使用Sliding Window技巧解題,首先要先定義出window的起點以及window size,那麼window的起點就會是使用for loop去迭代,window size就會是k值。只要window size滿足k值,就等於完成一次subarray的檢查,用for loop迭代逐一檢查,直到sliding window跑完整個陣列nums。

  1. 設定window size、window的起點與終點、目前平均數的最大值max、window內所有數的加總windowSum

  2. 為了排除陣列中的整數皆為負數的情況,先計算陣列中從index 0的位置加總k個整數的總合,並以此總合做為當前最大的總合值max

  3. 使用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

  4. 完成以上的步驟,取得最大值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;
};

上一篇
[Day8] Pattern - Sliding Window
下一篇
[Day10] Fruit Into Baskets
系列文
刷題筆記20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言