零、写在前面
这个系列不经常更新,今天这个题目又双叒叕觉得有点意思,我们一起看一看,主要知识点在
《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. 子数组最大平均数 Ihttps://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;
}
结果分析
凑合玩
写在最后
这个系列确实是不怎么更新,但是我觉得有难度的题都会进行更新,所以还是建立一个合集,有需要的欢迎关注。