零、写在前面
这个系列不经常更新,今天这个题目又双叒叕觉得有点意思,我们一起看一看,主要知识点在
《C语言入门100例》(第10例) 平均数
https://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的连续子序列的时候,每次都要回溯,浪费大量的时间。看两张图对比,可以发现
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. 子数组最大平均数 I
https://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; }
结果分析
凑合玩
写在最后
这个系列确实是不怎么更新,但是我觉得有难度的题都会进行更新,所以还是建立一个合集,有需要的欢迎关注。