1874. 两个数组的最小乘积和 🔒
题目描述
给定两个长度相等的数组a和b,它们的乘积和为数组中所有的a[i] * b[i]之和,其中0 <= i < a.length。
- 比如
a = [1,2,3,4],b = [5,2,3,1]时,它们的乘积和为1*5 + 2*2 + 3*3 + 4*1 = 22
现有两个长度都为n的数组nums1和nums2,你可以以任意顺序排序nums1,请返回它们的最小乘积和。
示例 1:
输入: nums1 = [5,3,4,2], nums2 = [4,2,2,5] 输出: 40 解释: 将 num1 重新排列为 [3,5,4,2] 后,可由 [3,5,4,2] 和 [4,2,2,5] 得到最小乘积和 3*4 + 5*2 + 4*2 + 2*5 = 40。
示例 2:
输入: nums1 = [2,1,4,5,7], nums2 = [3,2,4,8,6] 输出: 65 解释: 将 num1 重新排列为 [5,7,4,1,2] 后,可由 [5,7,4,1,2] 和 [3,2,4,8,6] 得到最小乘积和 5*3 + 7*2 + 4*4 + 1*8 + 2*6 = 65。
提示:
n == nums1.length == nums2.length1 <= n <= 1051 <= nums1[i], nums2[i] <= 100
解法
方法一:贪心 + 排序
思考
两数组对应相乘再求和,其中一个可任意重排,求最小乘积和。正数情形下,大数应配小数。
将 \(nums1\) 升序、\(nums2\) 降序后对应相乘累加,即重新排列中的最小点积。
由于两个数组都是正整数,要使得乘积和最小,我们可以将两个数组中的最大值和最小值相乘,次大值和次小值相乘,以此类推。
因此,我们将数组 \(\textit{nums1}\) 按照升序排序,将数组 \(\textit{nums2}\) 按照降序排序,然后将两个数组对应位置的元素相乘,累加即可。
时间复杂度 \(O(n \times \log n)\),空间复杂度 \(O(\log n)\)。其中 \(n\) 是数组 \(\textit{nums1}\) 的长度。
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 | |