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

为何我的新年混乱问题解法用index仍超时?求技术解析

为什么我的minimumBribes解法在长列表上超时?

你的解法思路是每次移除当前列表的最大值,累加其到列表末尾的距离作为移动次数,但在超长列表上超时,核心原因是时间复杂度太高,具体分析如下:

时间复杂度拆解

你的代码每次循环包含三个高开销操作:

  • max(q):遍历整个列表查找最大值,时间复杂度为O(n)
  • q.index(max_value):再次遍历列表定位最大值的位置,时间复杂度O(n)
  • q.pop(max_value_index):若删除的不是列表末尾元素,Python需要移动该位置之后的所有元素填补空位,时间复杂度O(n)

每次循环处理一个元素,总共需要处理n个元素,因此整体时间复杂度为O(n²)。当列表长度n达到104甚至105量级时,O(n²)的算法会产生108到1010次操作,远远超出程序的时间限制,必然导致超时。

额外的性能损耗

除了核心的时间复杂度问题,还有两个细节会加剧性能下降:

  • 每次循环都要修改原列表(pop操作),频繁的内存操作会增加额外开销
  • 重复遍历列表查找最大值和其位置,做了大量冗余计算

优化方向参考

不需要每次修改列表,直接在原列表上从后往前遍历统计即可,能将时间复杂度降到O(n)级别:

  1. 遍历每个元素,检查该元素是否贿赂超过2次:如果q[i] - (i+1) > 2,直接输出"Too chaotic"
  2. 统计总移动次数:对于每个元素,仅检查它原本位置前2位范围内的元素(因为最多只能贿赂2次),统计其中比它大的元素数量,累加得到总移动次数

优化后的示例代码:

def minimumBribes(q):
    total_moves = 0
    for i in range(len(q)-1, -1, -1):
        # 检查是否超过最大贿赂次数
        if q[i] - (i + 1) > 2:
            print("Too chaotic")
            return
        # 统计当前元素前面被它挤到后面的元素数量(最多往前查2位)
        start = max(0, q[i] - 2)
        for j in range(start, i):
            if q[j] > q[i]:
                total_moves += 1
    print(total_moves)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:35:29