You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取列表中前缀最大值的所有索引?是否有更优实现?

寻找列表中前缀最大值的索引:更优实现方式

你要找的是列表里所有前缀严格最大值的索引——也就是每个位置的元素比前面所有元素都大。你的原代码逻辑是正确的,下面提供几种更简洁或优化的实现方式,所有方法的时间复杂度都是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:04