如何优化查找数组左右元素和相等的平衡点的Python代码?
问题分析
原代码超时的根本原因是时间复杂度达到了O(n²):每次循环都对左右两个切片执行sum()操作,单次求和的开销为O(n),当测试用例的数组长度较大时,总运算量会快速增长,触发超时。
优化方案
方案1:总和累加遍历法(最优,时间复杂度O(n),空间复杂度O(1))
- 核心逻辑:先计算数组的总求和结果,遍历数组时仅维护左侧元素的累加和,右侧元素和可以通过「总和 - 左侧和 - 当前元素值」直接计算得到,无需重复切片求和。
- 优化后代码:
def balancedSums(arr): total = sum(arr) left_sum = 0 for num in arr: right_sum = total - left_sum - num if left_sum == right_sum: return "YES" left_sum += num return "NO"
- 可选优化点(可结合题目约束使用):
- 数组长度为1时可直接返回
YES,无需遍历 - 若数组元素全为非负数,当
left_sum * 2 + num > total时可提前终止遍历,后续不可能出现平衡元素
- 数组长度为1时可直接返回
方案2:前缀和数组法(时间复杂度O(n),空间复杂度O(n))
- 核心逻辑:提前生成前缀和数组,
prefix[i]代表前i个元素的和,遍历的时候直接取prefix[i]作为左侧和,右侧和为prefix[-1] - prefix[i+1],对比相等即可。该方案适合需要多次查询平衡元素的场景,单次查询的场景效率低于方案1。
内容的提问来源于stack exchange,提问作者Apurva Gaurav
相关产品推荐
相关产品推荐

