Leetcode643 Maximum Average Subarray I

題目

Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value.

Example 1:

Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation: Maximum average is (12-5-6+50)/4 = 51/4 = 12.75

Note:

  1. 1 <= k <= n <= 30,000.
  2. Elements of the given array will be in the range [-10,000, 10,000].


中文大意

給定一個長度爲n的整型數組,找出具有最大均值的連續k個元素的子數組,輸出結果爲這個最大均值


分析:

(1)這個題目很簡單,如果我們使用很常規的方法,遍歷數組中下標爲0至nums.length -k之間的元素,然後計算出該元素與其後k-1個元素的和。但是我們會發現這樣效率很低,很低的原因是,每當遍歷一個元素的時候,都需要進行k-1次加法運算。

(2)我們可以使用滑動窗口的思想來解決這個問題,當窗口滑動的時候,只需要在上次窗口所得和的基礎上減去滑出去的元素值,同時加上滑進來的元素值就可以了,這樣就減少了很多計算量。

(3)在實現過程中,竟然折在了for循環上,所以現在補充一下for循環的機制(大神勿噴,可以略過這一個部分啦):

for循環的執行過程是這樣的:

給出一個例子:

for(int i = 0;i <10;i++){
    System.out.println(i);
}
a.初始化,即int i= 0,整個循環中,初始化只進行一次;

b.判斷是否滿足循環條件(i < 10),如果滿足,則執行循環體;如果不滿足,那麼for循環結束,執行for循環後面的程序。

c.當循環體執行完成後,進行i++,進行下一次循環;重複b步驟。


(而本人就是忘記了,在初始化後是會先判斷是否滿足條件的,所以導致下面的代碼中第二個for循環進不去了……)


java代碼實現

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        
        int sum = 0;
        for(int i = 0;i < k;i++){
            sum += nums[i];
        }
        
        int max = sum;
        
        for(int j = 1; j <= nums.length - k;j++){
            sum = sum - nums[j-1] + nums[j+k-1];
            
            max = max > sum ? max : sum;
        }
        
        return (double)max/k;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章