滑动窗口求固定长度子数组最大平均值:先用整型计算最大连续和,最后统一除以k,避免浮点误差与重复除法,时间复杂度o(n)。

用滑动窗口解决固定长度子数组平均值问题
直接上结论:不需要算所有子数组的平均值再比较,用滑动窗口一次遍历就能拿到最大平均值,时间复杂度从 O(n×k) 降到 O(n)。关键不是除法,而是先比和——因为分母 k 固定,最大平均值必然对应最大连续和。
为什么不能边滑边除?
滑动时如果对每个窗口都调用 sum / k 再比较,会引入浮点误差,还多做无谓除法。更糟的是,某些编译器或平台下 double 除法可能触发非预期的舍入行为,导致相等判断失败(比如两个数学上相同的平均值被判定为不等)。
- 只在最后一步除一次:找到最大
sum后,统一转成double除以k - 全程用整型累加,避免精度漂移
- 如果输入是
vector<double></double>,也建议先乘以足够大的整数转为long long处理(需确认数据范围)
std::accumulate 能不能直接用?
可以,但仅限初始化第一个窗口;后续必须手动维护窗口和,否则又退化成 O(n×k)。别写成每步都调 accumulate(nums.begin()+i, nums.begin()+i+k, 0LL) —— 这等于没滑动。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
正确做法:
long long window_sum = accumulate(nums.begin(), nums.begin() + k, 0LL); long long max_sum = window_sum; for (int i = k; i (max_sum) / k;
边界和类型容易踩的坑
这个问题看似简单,但线上出错多集中在三处:
-
k > nums.size():必须提前检查,否则accumulate越界或循环i-k下标非法 - 用
int存window_sum:当nums元素绝对值大或k较大时极易溢出,务必用long long - 返回类型写成
int或忘了static_cast<double></double>:题目明确要求“平均值”,C++ 默认整除会截断
最隐蔽的问题是:当 nums 全为负数时,max_sum 初始值不能设为 0,必须用第一个窗口和,否则结果恒为 0.0。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










