算法2: 求子数组最大平均数

一.我的解法,思路在代码注释中

需求:求子数组最大平均数
在这里插入图片描述
代码

public class WzwTest
{
    public static void main(String[] args)
    {

        // 输入:[1,12,-5,-6,50,3], k = 4
        int[] arr = { 1, 12, -5, -6, 50, 3 };
        int k = 4;

        double arrayMaxAvg = getArrayMaxAvg(arr, k);
        // 输出:12.75
        System.out.println("arrayMaxAvg = " + arrayMaxAvg);
    }

    /**
     * 解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
     * @param nums
     * @param k
     * @return
     */
    private static double getArrayMaxAvg(int[] nums, int k)
    {
        // double为了小数不被省略
        double sum = 0;
        // 记录大的数
        double maxSum = 0;
        // 循环数组,累加需要k数量的总数
        for (int i = 0; i < nums.length; i++)
        {
            // 判断是否加完第一组的子数组总数
            if (i < k)
            {
                // 总数
                sum += nums[i];
                // 如果i+1 = k 说明第一组的子数组总数已经得到
                if (i + 1 == k)
                {
                    // 因为是第一组,可以直接赋值最大
                    maxSum = sum;
                }
                // 终止一下操作,继续上面的循环
                continue;
            }

            // 滑动窗口写法:总数减去第一个数,加上下一个数
            // 总数+ 数组[5] - 数组[4-4=0]
            sum = sum + nums[i] - nums[i - k];
            // 比较两个子数组总数的大小
            maxSum = Math.max(maxSum, sum);
        }

        // 总数/k ==> 51/4
        return maxSum / k;
    }
}

二.官方的解法[下面有图解]

在这里插入图片描述
第一组没人比较直接赋值
在这里插入图片描述

第二组和第一组之和比较最大值,结果是第二组51大

在这里插入图片描述

第3组和上组比较最大值51比较,明显结果还是51大

在这里插入图片描述

第4组和上组比较最大值51比较,明显结果还是51大

在这里插入图片描述

第5组和上组比较最大值51比较,明显结果还是51大

在这里插入图片描述

最后求子数组最大平均数

在这里插入图片描述

官方代码

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

总结:

  1. 学习了滑动窗口的思想
  2. 对算法了兴趣+1
  3. 对时间算法结构有了丝丝的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值