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
相关产品推荐
相关产品推荐

