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

Python计算移除数组全部元素最小成本的代码异常排查

问题本质

要得到最小总成本,核心逻辑是越大的元素越早移除:每个元素会被计入总成本的次数等于它在数组中存留的操作轮次,最小的元素会全程存留到最后,计入次数等于数组长度N,次小的计入N-1次,最大的元素仅计入1次。

现有代码的错误点

你代码的核心bug是遍历列表的同时修改列表长度,导致循环次数不足:
Python的for each in A是基于索引迭代原列表,你每次调用pop()会缩短列表长度,当迭代索引超过当前列表长度时循环就会提前终止,对于长度为31的测试用例,你的循环仅执行了16次,少了15次总和累加,自然结果不对。
另外你每次调用sum(A)是O(N)操作,整体时间复杂度是O(N²),数据规模大的时候效率很低,还有len(A) is 1写法不规范,is用于身份判断,长度比较应该用==。

修正方案

直接按每个元素的权重计算总和即可,逻辑简单效率高,时间复杂度仅O(NlogN)(排序开销):

def solve(self, A):
    A.sort()
    n = len(A)
    total = 0
    for idx, num in enumerate(A):
        # 权重是n - idx:最小的元素权重n,最大的权重1
        total += num * (n - idx)
    return total

如果你想保留原来的逐步pop的写法,要把循环改成按次数循环,同时优化求和逻辑:

def solve(self, A):
    A.sort()
    sm = sum(A)
    current_sum = sm
    # 明确循环n-1次,不要遍历正在修改的列表
    for _ in range(len(A)-1):
        pop_val = A.pop()
        current_sum -= pop_val
        sm += current_sum
    return sm
结果验证

两种写法计算你给出的长测试用例,结果都是204428,和预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:06:04