Leetcoe 643.子数组最大平均数I


前言

二月份的快乐简单题!


提示:以下是本篇文章正文内容,下面代码可供参考

一、题目の描述

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例:
输入:[1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
提示:
1 <= k <= n <= 30,000。
所给数据范围 [-10,000,10,000]。

二、分析及代码

  1. 维护一个长度为 k 的滑动窗口。当滑动窗口从下标范围[ i , i + k - 1 ] 移动到下标范围 [ i + 1 , i + k ]时,nums[ i ]从窗口中移出,nums[ i + k ]进入到窗口内;
  2. 利用上述关系,可以在 O(1) 的时间内通过 sum-nums[ i ] + nums[ i + k ]计算出下一个滑动窗口的子数组元素和​;
  3. 第一个子数组的元素和需要通过计算 nums 的前 k 个元素之和得到,利用上述关系可以快速计算出其他子数组的元素和;
  4. 只需要遍历数组 nums 一次即可得到每个长度为 k 的子数组的元素和,时间复杂度是 O(n);
  5. 利用最大的子数组元素和计算出最大平均数。

代码如下(示例):
double findMaxAverage(int* nums, int numsSize, int k){
    double sum = 0,maxSum = 0;
    for(int i = 0; i < k;i++){
        sum += nums[i];
    }
    maxSum =sum;//计算前k个元素之和
    for(int i = 0;i + k < numsSize;i++){
            sum = sum + nums[i + k] - nums[i];//滑动窗口向后滑动
            maxSum = fmax(maxSum,sum);//更新最大子数组和       
    }
    return maxSum / k;//计算平均数

三、总结

方法和思路都挺简单的一道题,边界条件考虑仔细就不会有问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值