一、題目
鏈接:643. 子數組最大平均數 I - 力扣(LeetCode)
?
函數原型:
double findMaxAverage(int* nums, int numsSize, int k)
二、思路?
滑動窗口:
先計算數組前k個元素總和,作為第一個窗口,默認第一個窗口元素總和為最大總和。隨后從第k+1個元素開始遍歷數組,相當于窗口向右滑動,計算當前窗口元素總和:上一個窗口元素總和,減去上一個窗口第一個元素,加上當前窗口最后一個元素(即正在遍歷的元素)。比較當前窗口與最大窗口總和,選取最大的窗口總和。最后返回最大窗口總和/k,即最大平均值。
小技巧:double類型值計算比較慢,所以計算過程中間值用int型,最后將結果強制類型轉換為double類型即可。
三、代碼
double findMaxAverage(int* nums, int numsSize, int k) {int sum=0;//當前窗口元素總和int maxsum = 0;//選取最大的和//計算前k個數據總和for (int i = 0; i < k; i++){sum += nums[i];}maxsum = sum;//初始時默認以第一個窗口元素總和為最大//滑動窗口for (int i = k; i < numsSize; i++){sum = sum + nums[i] - nums[i - k];//減去原窗口第一個元素,加上新窗口最后一個元素maxsum = fmax(maxsum, sum);}return (double)maxsum / k; }