題目
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 <=
k
<=n
<= 30,000. - 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;
}
}