LeetCode第643题代码返回12而非12.75,求原因(最大子数组平均数)
LeetCode 643题「最大子数组平均数」代码错误分析与修正
你的代码存在三个核心问题,导致计算结果错误:
- 子数组元素个数计算错误:内层循环条件
j < i+k-1只累加了k-1个元素,而非题目要求的k个。比如测试用例中k=4时,实际只计算了每个子数组的前3个元素,漏掉了第4个,直接导致和的计算偏小。 - 累加和未重置:变量
s在每次外层循环(切换子数组起始位置)时没有重置为0,后续子数组的和是在前一个子数组和的基础上继续累加,完全偏离了正确的子数组和计算逻辑。 - max更新时机错误:每次累加单个元素后就更新
max,此时s还不是完整的长度为k的子数组和,导致max记录的是部分元素的和,而非目标子数组的和。
修正后的代码(滑动窗口优化版)
class Solution { public double findMaxAverage(int[] nums, int k) { int n = nums.length; long sum = 0; // 用long避免整数溢出 // 计算第一个窗口的和 for (int i = 0; i < k; i++) { sum += nums[i]; } long maxSum = sum; // 滑动窗口计算后续窗口的和 for (int i = k; i < n; i++) { sum = sum - nums[i - k] + nums[i]; maxSum = Math.max(maxSum, sum); } return (double) maxSum / k; } }
修正说明
- 先计算第一个长度为k的子数组和,用
long类型避免数组元素和过大时的整数溢出问题; - 滑动窗口优化:每次移动窗口时,减去离开窗口的元素,加上进入窗口的元素,以O(n)时间复杂度高效计算每个窗口的和;
- 只记录完整k元素子数组的最大和,最后除以k得到正确的最大平均值。
内容的提问来源于stack exchange,提问作者Gargi
相关产品推荐
相关产品推荐

