为何我的新年混乱问题解法用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)级别:
- 遍历每个元素,检查该元素是否贿赂超过2次:如果
q[i] - (i+1) > 2,直接输出"Too chaotic" - 统计总移动次数:对于每个元素,仅检查它原本位置前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
相关产品推荐
相关产品推荐

