Python中查找列表最长连续正数子列表?求优化方案
优化最长连续正数子列表的Python代码方案
你的代码思路没问题,但嵌套循环会让时间复杂度升到O(n²),而且变量管理有点繁琐。下面给你几个更简洁高效的方案,顺便讲下对应的Python技巧和术语:
方案1:单次遍历法(O(n)时间复杂度)
这是最基础的优化思路,只遍历列表一次,实时跟踪当前连续正数的起始位置和长度,同时记录最长的那一组:
A = [-1,2,-3,2,3,-4,3,4,5,-6,-19,-20,7,8,9,10,6,8,-19,-22,-99] max_len = 0 current_len = 0 start_idx = 0 best_start = 0 best_end = 0 for idx, num in enumerate(A): if num >= 0: current_len += 1 # 第一次遇到正数时记录起始位置 if current_len == 1: start_idx = idx # 更新最长子列表的信息 if current_len > max_len: max_len = current_len best_start = start_idx best_end = idx else: current_len = 0 print("The longest list with positive numbers are", A[best_start:best_end+1])
用到的技巧&术语:
- 单次遍历:把时间复杂度从原来的O(n²)降到O(n),效率大幅提升
- enumerate():同时获取列表的索引和元素,避免手动计算位置
- 状态跟踪:用变量记录当前连续序列的状态(长度、起始位置),实时更新最优解
方案2:用itertools.groupby分组(Python标准库工具)
利用itertools.groupby可以快速把连续的相同特征的元素分组,这里我们按“是否为正数”来分组:
from itertools import groupby A = [-1,2,-3,2,3,-4,3,4,5,-6,-19,-20,7,8,9,10,6,8,-19,-22,-99] # 按是否为正数分组,过滤掉负数组,只保留正数的子列表 positive_groups = [list(group) for key, group in groupby(A, lambda x: x >= 0) if key] # 找出最长的那个正数子列表 longest = max(positive_groups, key=len) print("The longest list with positive numbers are", longest)
用到的技巧&术语:
- itertools.groupby:Python标准库中的迭代器工具,用于连续元素的分组,核心是通过
key函数定义分组规则 - lambda表达式:匿名函数,用来快速定义分组的判断逻辑(这里判断元素是否≥0)
- 列表推导式:简洁地过滤和转换分组结果,生成只包含正数子列表的列表
- max()的key参数:通过指定
key=len,直接按子列表长度找出最长的那个
方案3:生成器+max函数(极简函数式风格)
如果想要更简洁的写法,可以用生成器表达式替代列表推导式,减少内存占用(不需要存储所有正数子列表,只在迭代时计算):
from itertools import groupby A = [-1,2,-3,2,3,-4,3,4,5,-6,-19,-20,7,8,9,10,6,8,-19,-22,-99] # 生成器表达式,只迭代不存储所有分组 longest = max((list(group) for key, group in groupby(A, lambda x: x >= 0) if key), key=len) print("The longest list with positive numbers are", longest)
用到的技巧&术语:
- 生成器表达式:和列表推导式类似,但返回的是迭代器,不会一次性把所有元素加载到内存,适合处理大列表
- 函数式编程风格:通过组合标准库函数和表达式,用更少的代码实现逻辑,可读性更高
内容的提问来源于stack exchange,提问作者Stevendo
相关产品推荐
相关产品推荐

