📅  最后修改于: 2023-12-03 15:27:35.522000             🧑  作者: Mango
给定两个长度相等的数组nums1
和nums2
,现在可以对它们进行任意次数的交换操作,交换操作的定义是选择两个下标i
和j
并交换nums2[i]
和nums2[j]
。最终得到的数组需要满足nums1[i]*nums2[i]
的和最小。
首先需要对nums1
进行排序,然后对nums2
的每个数找到与其对应的nums1
中的最小数并记录下来。最后将nums1
和nums2
中的数逐个相乘求和即可。
def minProductSum(nums1, nums2):
nums1.sort()
nums2 = [nums2[i] for i in sorted(range(len(nums2)), key=lambda k: nums2[k])]
return sum([nums1[i]*nums2[i] for i in range(len(nums1))])
时间复杂度为$O(nlogn)$,其中$n$为数组长度。排序花费$O(nlogn)$的时间,遍历数组花费$O(n)$的时间。
空间复杂度为$O(n)$,需要额外的数组存储排序后的nums2
。
该算法的思路较为简单,排序后对应相乘即可。但在实现中需要注意细节,如如何将nums2
排序后的下标对应到nums1
。