初识滑动窗口:【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;
    }


相关文章
|
5月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计中位数为 K 的子数组
C++前缀和算法的应用:统计中位数为 K 的子数组
|
7月前
|
算法
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
22 0
|
6天前
|
算法 测试技术 C#
【对顶队列】【中位数贪心】【前缀和】3086. 拾起 K 个 1 需要的最少行动次数
【对顶队列】【中位数贪心】【前缀和】3086. 拾起 K 个 1 需要的最少行动次数
|
6天前
|
测试技术
643.子数组最大平均数
643.子数组最大平均数
10 0
|
6天前
leetcode:643. 子数组最大平均数 I(滑动窗口)
leetcode:643. 子数组最大平均数 I(滑动窗口)
17 0
|
6天前
|
算法 测试技术 C#
【滑动窗口】C++算法:K 个不同整数的子数组
【滑动窗口】C++算法:K 个不同整数的子数组
|
6天前
|
算法 测试技术 C#
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
|
6天前
|
算法 测试技术 C#
【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值
【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值
|
6天前
|
存储 Java C++
leetcode-239:滑动窗口最大值
leetcode-239:滑动窗口最大值
27 0
|
7月前
|
存储 算法
算法:滑动窗口解决连续区间子数组问题
算法:滑动窗口解决连续区间子数组问题