1. 程式人生 > 其它 >leetcode刷題打卡 ---- 643子陣列最大平均數

leetcode刷題打卡 ---- 643子陣列最大平均數

技術標籤:資料結構與演算法

題目描述:

給定 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; } }

在這裡插入圖片描述