Python列表两数乘积最小和求解:代码逻辑错误排查求助
解决列表两数乘积最小和的问题
首先,你的核心思路完全正确——把列表排序后,用最小的元素和最大的元素配对相乘,次小和次大配对,以此类推,这样得到的乘积和确实是最小的。但代码里有一个关键错误:嵌套的for循环会把两个列表里的所有元素两两相乘再累加,而不是你想要的对应位置元素配对相乘。
拿你的例子[5,4,2,3]来说,排序后srt = [2,3,4,5],逆序rev = [5,4,3,2],你取前2个元素得到my_list = [2,3],my_rev = [5,4]。你的嵌套循环会计算:5*2 +5*3 +4*2 +4*3 = 10+15+8+12=45,这显然和预期的22不符。
修正后的代码
我们只需要让两个列表对应位置的元素配对相乘后累加即可,不需要嵌套循环。这里有两种简洁的实现方式:
方式1:直接遍历索引计算
def min_sum(arr): srt = sorted(arr) rev = sorted(arr, reverse=True) half_len = len(arr) // 2 res = 0 for i in range(half_len): res += srt[i] * rev[i] print(res) # 测试你的例子 min_sum([5,4,2,3]) # 输出22
方式2:用zip配对元素(更简洁)
zip可以把两个列表的对应元素打包成元组,我们直接遍历这些元组计算乘积和:
def min_sum(arr): srt = sorted(arr) # 取排序后列表的前半部分,和逆序列表的前半部分配对 rev = sorted(arr, reverse=True) res = sum(a*b for a, b in zip(srt[:len(arr)//2], rev[:len(arr)//2])) print(res) # 测试你的例子 min_sum([5,4,2,3]) # 输出22
为什么这个思路能得到最小和?
从数学角度来说,这是排序不等式的结论:对于两组有序数,逆序配对相乘的和 ≤ 乱序配对的和 ≤ 顺序配对的和。你的初始思路完全站得住脚,只是循环逻辑写错了。
内容的提问来源于stack exchange,提问作者hissroth
相关产品推荐
相关产品推荐

