从数组两端选取B个元素求最大和的Python代码错误排查求助
代码错误排查与修复
首先,咱们来看看你的代码为什么会得到错误结果6,而不是正确的8。
核心错误分析
你的思路方向是对的——先算全选左端B个元素的和,再逐步替换左端元素为右端元素,每次取最大值。但有两个关键错误拖了后腿:
- 初始索引选反了
你把左指针i初始设为0,这意味着每次替换的是最左边的左端元素,而正确的逻辑应该是从最右边的左端元素开始替换(这样才能覆盖所有「左k个+右(B-k)个」的组合)。 - 指针完全没更新
循环里你没有移动i和j,导致每次都在减同一个左端元素(A[0])、加同一个右端元素(A[4]),根本没遍历到正确的组合。
修复后的代码
调整索引初始值,并在循环中更新指针,就能得到正确结果:
def solve(A, B): n = len(A) # 初始计算前B个元素的和 current_sum = sum(A[:B]) max_sum = current_sum # 从最右边的左端元素开始,逐个替换成右端元素 left_idx = B - 1 right_idx = n - 1 for _ in range(B): # 去掉当前最右边的左端元素,加上当前右端元素 current_sum -= A[left_idx] current_sum += A[right_idx] # 更新最大值 max_sum = max(max_sum, current_sum) # 移动指针,处理下一组替换 left_idx -= 1 right_idx -= 1 return max_sum
测试示例验证
用你的测试输入A = [5, -2, 3, 1, 2],B = 3运行修复后的代码:
- 初始
current_sum是前3个元素的和:5 + (-2) + 3 = 6,max_sum = 6 - 第一次循环:去掉
A[2](3),加上A[4](2),current_sum = 6 - 3 + 2 = 5,max_sum保持6 - 第二次循环:去掉
A[1](-2),加上A[3](1),current_sum = 5 - (-2) + 1 = 8,max_sum更新为8 - 第三次循环:去掉
A[0](5),加上A[2](3),current_sum = 8 - 5 + 3 = 6,max_sum保持8
最终返回8,和预期结果完全一致。
另一种更直观的实现方式
如果想让逻辑更清晰,也可以用前缀和+后缀和的方式,遍历所有可能的组合:
def solve(A, B): n = len(A) # 前缀和:prefix[k]是前k个元素的和(k从0到B) prefix = [0] * (B + 1) for k in range(1, B+1): prefix[k] = prefix[k-1] + A[k-1] # 后缀和:suffix[m]是后m个元素的和(m从0到B) suffix = [0] * (B + 1) for m in range(1, B+1): suffix[m] = suffix[m-1] + A[n - m] # 遍历所有左k+右(B-k)的组合,取最大值 max_sum = 0 for k in range(B+1): current = prefix[k] + suffix[B - k] if current > max_sum: max_sum = current return max_sum
这种方式可读性更强,也不容易出错,适合用来理解底层逻辑。
内容的提问来源于stack exchange,提问作者Maws
相关产品推荐
相关产品推荐

