给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

示例 1:

输入: [1,12,-5,-6,50,3], k = 4
输出: 12.75
解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

注意:

  1. 1 <= k <= n <= 30,000。
  2. 所给数据范围 [-10,000,10,000]。

分析:
题解一:
直接暴力求解,每次把 k 个加起来,找出最大和,返回最大和除以 k

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        int len = nums.length;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i <= len - k; i++) {
            int t = 0;
            for (int j = i; j < i + k; j++)
                t += nums[j];
            max = Integer.max(max, t);
        }
        return max * 1.0 / k;
    }
}

题解二:
发现其实有些是重复计算了的,比如
nums[] = [1,2,3,4,5,6,7],k = 3;
第一次是 1 + 2 + 3
第二次是 2 + 3 + 4
第三次是 3 + 4 + 5
….
如果能维护一个数组,每次只加新遇见的数组值和减去末尾的数组值,就把每次 k 次的计算量减少到固定的 2 次

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        int len = nums.length;
        int max = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = 0; i < k; i++) {
            sum += nums[i];
            max = sum;
        }
        for (int i = k; i < len; i++) {
            sum += nums[i] - nums[i - k];
            max = Integer.max(sum, max);
        }
        return max * 1.0 / k;
    }
}