(结题报告)《C语言入门100例》(第10例) 平均数

本文介绍了一道力扣问题,探讨如何使用C语言找出数组中平均数最大的子数组。首先尝试通过两层循环求解,但这种方法导致超时。随后调整思路,先计算0到k的和,再动态更新子数组和,提高效率。
摘要由CSDN通过智能技术生成

零、题目

力扣https://leetcode-cn.com/problems/maximum-average-subarray-i/

一、 思路

1、

两层循环,一层是循环的起点,第二层是从起点开始+k个数的和,然后比较,大的留下

double findMaxAverage(int* nums, int numsSize, int k){
    int max=-1000000;
    int sum;
    for(int i=0;i+k-1<numsSize;i++){ //1层循环,起点
        sum=0;
        for(int j=0;j<k;j++){ // 再从起点往后+k个数
            sum+=nums[j+i];
        }
        if(sum>=max){       //大的留下
            max=sum;
        }
    }
    return (double)max/(double)k;
}

 完美

然后超时了

2、

换一个思路,先算0到k和是多少,然后往后挪,剪掉前一个,加上后一个

double findMaxAverage(int* nums, int numsSize, int k){
    int sum=0;
    for(int i=0;i<k;i++){      //先算前k个的和
        sum+=nums[i];
    }
    int max=sum;
    int l=0,r=k;        // 这是左边端点和右边端点
    for(int p=0;r+p<numsSize;p++){
        sum=sum+nums[r+p]-nums[l+p];  //把这个p+在l,r上,让这个长度k的区间右移
        if(sum>max){
            max=sum;    //大的留下
        }
    }
    return (double)max/k;   //完事!
}

结果 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白-checkmate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值