leetcode刷題打卡 ---- 643子陣列最大平均數
阿新 • • 發佈:2021-02-11
技術標籤:資料結構與演算法
題目描述:
給定 n 個整數,找出平均數最大且長度為 k 的連續子陣列,並輸出該最大平均數。
示例:
輸入:[1,12,-5,-6,50,3], k = 4
輸出:12.75
解釋:最大平均數 (12-5-6+50)/4 = 51/4 = 12.75
提示:
- 1 <= k <= n <= 30,000。
- 所給資料範圍 [-10,000,10,000]。
解題思路:
首先會直接想到暴力法來解題,將陣列中所有可能的子陣列結果計算出其平均值,然後找出最大的那個平均值。
class Solution {
public double findMaxAverage(int [] nums, int k) {
int sum=0;
for(int j=0;j<k;j++){
sum+=nums[j];
}
double anum=sum/(k*1.0);
for(int i=1;i<=nums.length-k;i++){
sum=0;
for(int j=i,m=0;m<k;j++,m++){
sum+=nums[j];
}
if (sum/(k*1.0)>anum)
anum=sum/(k*1.0);
}
return anum;
}
}
但這樣非常耗時。
優化方案:每次的子陣列不再重新計算,採用 減去上一次的首段再加上新的尾部 來計算
class Solution {
public double findMaxAverage(int[] nums, int k) {
int sum = 0;
int n = nums.length;
for (int i = 0; i < k; i++) {
sum += nums[i];
}
int maxSum = sum;
for (int i = k; i < n; i++) {
sum = sum - nums[i - k] + nums[i];
maxSum = Math.max(maxSum, sum);
}
return 1.0 * maxSum / k;
}
}