Python遍历列表求指定长度k区间最大和的代码如何优化?
代码优化方案
- 原代码采用双层循环逐段求和,时间复杂度为O(nk),当列表长度和k都较大时运行效率较低
- 存在冗余的临时列表
temp和重复求和操作,可完全优化去除
最优实现(滑动窗口法)
仅需要计算一次初始窗口和,之后每次减去移出窗口的左端元素、加上新进入窗口的右端元素,无需重复计算整段和,时间复杂度O(n),支持k作为可变参数传入:
def max_k_sum(numb: list[int], k: int) -> int: # 边界参数校验 if k <= 0 or k > len(numb): raise ValueError("k的取值范围应为1到列表长度之间的整数") # 计算初始第一个窗口的和 current_sum = sum(numb[:k]) max_sum = current_sum # 窗口向后滑动遍历 for i in range(k, len(numb)): current_sum = current_sum - numb[i - k] + numb[i] if current_sum > max_sum: max_sum = current_sum return max_sum # 测试验证 numb = [100,33,22,200,333,1000,22] print(max_k_sum(numb, 2)) # 输出1333 print(max_k_sum(numb, 3)) # 输出1533
极简写法(适合小数据量场景)
如果列表长度较短、追求代码简洁,也可以用生成器表达式实现单行逻辑,可读性高:
max_sum = max(sum(numb[i:i+k]) for i in range(len(numb) - k + 1))
注意:该写法本质还是逐段求和,时间复杂度为O(nk),仅适合短列表场景使用,处理长列表优先选择滑动窗口方案。
内容的提问来源于stack exchange,提问作者Akshay Dudvadkar
相关产品推荐
相关产品推荐

