初识滑动窗口:【643. 子数组最大平均数 I】

简介: 初识滑动窗口:【643. 子数组最大平均数 I】

题目


子数组最大平均数 I


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


例如:

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

解法1(啪的一下,超时了)

  public double findMaxAverage(int[] nums, int k) {
        int left = 0;
        int right = k - 1;
        int max = Integer.MIN_VALUE;
        while (right < nums.length) {
            int sum = getSum(nums, left, right);
            if (max < sum) {
                max = sum;
            }
            right++;
            left++;
        }
        return (double) max / k;
    }
    public int getSum(int[] nums, int left, int right) {
        int sum = 0;
        for (int i = left; i <= right; i++) {
            sum += nums[i];
        }
        return sum;
    }

对于长度为n的数组,当k≤n时,有n-k+1个长度为k的子数组。如果直接计算每个子数组的元素和,时间复杂度过高,无法通过全部测试用例,因此需要使用时间复杂度更低的方法计算每个子数组的元素和。


解法2(正解)


以下图片引用自力扣 https://leetcode-cn.com/problems/maximum-average-subarray-i/solution/zi-shu-zu-zui-da-ping-jun-shu-i-by-leetc-us1k/


image.png


上述过程可以看成维护一个长度为 k 的滑动窗口。

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


相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
|
11月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计中位数为 K 的子数组
C++前缀和算法的应用:统计中位数为 K 的子数组
|
算法
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
46 0
|
1月前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
32 1
|
3月前
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
|
4月前
|
C++
643. 子数组最大平均数 I(C++)
643. 子数组最大平均数 I(C++)
|
6月前
|
测试技术
643.子数组最大平均数
643.子数组最大平均数
27 0
|
6月前
leetcode:643. 子数组最大平均数 I(滑动窗口)
leetcode:643. 子数组最大平均数 I(滑动窗口)
33 0
|
6月前
|
算法 测试技术 C#
【滑动窗口】C++算法:K 个不同整数的子数组
【滑动窗口】C++算法:K 个不同整数的子数组
|
6月前
|
算法 测试技术 C#
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目