【每日一题】LeetCode 643.最大平均数的连续子数组

【每日一题】LeetCode 643.子数组最大平均数 I(滑动窗口、字符串)

题目描述

给定一个整数数组 nums 和一个整数 k,任务是找出平均数最大的长度为 k 的连续子数组,并输出该最大平均数。任何误差小于 (10^{-5}) 的答案都将被视为正确答案。

输入示例

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

  2. 输入:nums = [5], k = 1
    输出:5.00000

提示

  • n == nums.length
  • 1 <= k <= n <= 10^5
  • -10^4 <= nums[i] <= 10^4

思路分析

这个问题可以通过滑动窗口的方法来解决。滑动窗口是一种常见的解决子数组问题的方法,利用一个固定大小的窗口在数组上滑动,通过更新窗口内元素的总和来快速计算子数组的和。

  1. 初始化一个变量 count 来存储窗口内元素的和。
  2. 遍历数组,对于窗口外的第一个元素,将其加到 count 中。
  3. 当窗口大小达到 k 时,检查当前窗口的平均数是否是目前为止最大的,如果是,则更新最大值 max
  4. 随着窗口向右滑动,从 count 中减去窗口左侧的第一个元素,然后加上新进入窗口的元素。
  5. 重复步骤3和4,直到遍历完整个数组。

【每日一题】LeetCode 643.最大平均数的连续子数组_第1张图片

代码实现

以下是Java语言的代码实现,包含了详细的注释说明。

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        // 特殊情况处理,如果数组只有一个元素,直接返回该元素作为最大平均数
        if (nums.length == 1) {
            return nums[0];
        }

        double count = 0; // 用于存储窗口内元素的和
        double max = -999999; // 初始化最大平均数为一个非常小的数

        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            count += nums[i]; // 将当前元素加入窗口

            // 当窗口大小小于k时,不进行最大值的比较
            if (i < k - 1) {
                continue;
            }

            // 当窗口大小达到k时,计算当前窗口的值,并与max比较
            if (count > max) {
                max = count; // 更新最大值
            }

            // 随着窗口滑动,减去窗口左侧的第一个元素
            count -= nums[i - k + 1];
        }

        // 返回最大值,除以k得到平均值
        return max / k;
    }
}


题外话:为什么程序员不喜欢户外活动?

因为外面没有他们的IDE(集成开发环境)!

你可能感兴趣的:(算法,leetcode,算法,java,数据结构)