643.子數組最大平均數 I

子數組最大平均數 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章