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

 零、写在前面

        这个系列不经常更新,今天这个题目又双叒叕觉得有点意思,我们一起看一看,主要知识点在

《C语言入门100例》(第10例) 平均数icon-default.png?t=LA92https://blog.csdn.net/WhereIsHeroFrom/article/details/118208466

一、主要知识点

        1.强制类型转换

        由于平均数会是一个浮点数,在计算的时候会用到类型转换。求平均数的时候double/int返回的值仍然是double。

int a,n,i;
double avg = 0;
for(int i = 0;i < n;++i){
    scanf("%d",&a);
    avg += a; //强制类型转换
}
avg /= n;    //第二次
printf("%.2f\n",avg);

        2.滑动窗口(补充知识点)

                当我们求长度为k的连续子序列的时候,每次都要回溯,浪费大量的时间。看两张图对比,可以发现sum_{i}=sum_{i - 1}+ nums\left [ i \right ] -nums\left [ i - k \right ]

        

         

    for(int i = 0;i < k;++i)    sum += nums[i];//最前面的初始化
    int maxsum = sum;
    for(int i = k;i < numsSize;++i){            //滑动窗口计算每个子序列的和
        sum += nums[i];            //加入当前值
        sum -= nums[i - k];        //减去滑动窗口最前面的值
        maxsum = sum > maxsum? sum :maxsum;//更新最大值
    }

二、课后习题 

   643. 子数组最大平均数 I

643. 子数组最大平均数 Iicon-default.png?t=LA92https://leetcode-cn.com/problems/maximum-average-subarray-i/

思路

利用上面说到的滑动窗口统计返回值就好了,注意类型转换。

double findMaxAverage(int* nums, int numsSize, int k){
    int sum = 0;
    //滑动窗口统计
    for(int i = 0;i < k;++i)    sum += nums[i];
    int maxsum = sum;
    for(int i = k;i < numsSize;++i){
        sum += nums[i];
        sum -= nums[i - k];
        maxsum = sum > maxsum? sum :maxsum;
    }
    //返回相应的结果
    return (double) maxsum /k;
}

结果分析

凑合玩


写在最后

这个系列确实是不怎么更新,但是我觉得有难度的题都会进行更新,所以还是建立一个合集,有需要的欢迎关注。

猜你喜欢

转载自blog.csdn.net/qq_17593855/article/details/121262348