如何获取列表中前缀最大值的所有索引?是否有更优实现?
寻找列表中前缀最大值的索引:更优实现方式
你要找的是列表里所有前缀严格最大值的索引——也就是每个位置的元素比前面所有元素都大。你的原代码逻辑是正确的,下面提供几种更简洁或优化的实现方式,所有方法的时间复杂度都是O(n)(这是这类问题的最优下限,因为必须遍历一次列表):
用itertools.accumulate简化逻辑
Python标准库的itertools.accumulate可以生成前缀累积的最大值序列,结合枚举就能轻松拿到目标索引:
import itertools a = [3, 1, 4, 1, 5, 9, 2, 6] indices = [] prev_max = float('-inf') for idx, current_max in enumerate(itertools.accumulate(a, max)): if current_max > prev_max: indices.append(idx) prev_max = current_max print(indices) # 输出: [0, 2, 4, 5]
这里accumulate(a, max)会逐个生成到当前位置为止的最大值,我们只需要判断当前最大值是否比前一个最大值大(满足严格大于的要求),是就记录索引。
精简手动循环(无额外依赖)
你的原代码可以去掉max_values列表,只跟踪当前最大值,减少不必要的空间开销:
a = [3, 1, 4, 1, 5, 9, 2, 6] if not a: indices = [] else: indices = [0] current_max = a[0] for idx, num in enumerate(a[1:], start=1): if num > current_max: indices.append(idx) current_max = num print(indices) # 输出: [0, 2, 4, 5]
这种方式和原代码逻辑完全一致,但空间复杂度从O(k)(k是前缀最大值的数量)降到了O(1)(除了存储结果的列表)。
关于性能的说明
所有可行的方法都无法突破O(n)的时间复杂度,因为每个元素至少需要被比较一次。如果追求代码简洁,itertools的方式更优雅;如果不想引入外部库,精简后的手动循环是最直接的选择。
内容的提问来源于stack exchange,提问作者Jürg W. Spaak
相关产品推荐
相关产品推荐

