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

列表元素与前序连续元素比较计数实现及O(n)复杂度优化咨询

代码问题修正与优化方案

原代码错误分析

你写的代码存在3个核心问题:

  • count变量没有在每次遍历i的时候重置,会把前序i的计数结果累加进来,导致结果错误
  • 内层用了while循环判断a[i] >= a[j],满足条件时只会无限给count加1,不会跳出循环,属于逻辑误用,这里应该用if判断
  • append操作放在了j的循环内,每个i会多次向li追加值,不符合每个i对应一个结果的需求

修正后的暴力实现代码

a = [1,2,3,2,4,6,1,2]
li = []
for i in range(len(a)):
    count = 0
    # 从i往前遍历,包括i自身
    for j in range(i, -1, -1):
        if a[i] >= a[j]:
            count += 1
        else:
            break
    li.append(count)
print(' '.join(map(str, li)))
# 输出:1 2 3 1 5 6 1 2

O(n)时间复杂度实现方案

这类求每个元素左侧最近的比它大的元素位置的问题,可以用单调栈算法优化到O(n)时间复杂度,每个元素只会入栈、出栈各一次:

a = [1,2,3,2,4,6,1,2]
li = []
# 栈内保存(元素值, 连续计数长度),维持单调递增的特性
stack = []
for num in a:
    cnt = 1
    # 栈顶元素小于等于当前数,就弹出累加计数
    while stack and stack[-1][0] <= num:
        cnt += stack.pop()[1]
    stack.append((num, cnt))
    li.append(cnt)
print(' '.join(map(str, li)))
# 输出:1 2 3 1 5 6 1 2

嵌套循环优化说明

所有需要向前/向后查找第一个满足大小关系元素的场景,都可以用单调栈替代嵌套循环,把时间复杂度从O(n²)降到O(n),常见适用场景包括接雨水、柱状图中最大矩形、下一个更大元素等经典算法题。

内容的提问来源于stack exchange,提问作者adarsh augustine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:15:02