📜  给定数组的元素对的最小乘积总和(1)

📅  最后修改于: 2023-12-03 15:11:40.417000             🧑  作者: Mango

给定数组的元素对的最小乘积总和

问题描述

给定两个长度为 n 的正整数数组 nums1 和 nums2,以及一个整数 k。定义一组值 (i,j) 满足 nums1[i]*nums2[j] 最大,同时满足 i+j ≤ k 。找到所有满足条件的元素对 (i,j),并计算这些元素对的最小乘积总和。

示例
示例1
输入:
nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出:
10
解释:
我们得到的元素对为
(1,1) : 1 * 4 = 4
(2,1) : 7 * 4 = 28
(1,2) : 1 * 6 = 6
因此,最小乘积总和为 4 + 6 = 10。
示例2
输入:
nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出:
1
解释:
我们得到的元素对为
(1,1) : 1 * 1 = 1
因此,最小乘积总和为 1。
算法
  1. 将 nums1 和 nums2 分别排序。
  2. 使用双指针 i 和 j,从 nums1 和 nums2 的末尾开始向前遍历。每次找到 nums1[i]*nums2[j] 最大的元素对,并记录进答案数组 ans 中。
  3. 将 ans 数组中的元素从小到大排序,取出前 k 个数,并计算它们的和即为最小乘积总和。
代码实现
def minProductSum(nums1: List[int], nums2: List[int], k: int) -> int:
    n = len(nums1)
    nums1.sort()
    nums2.sort()
    ans = []
    i, j = n - 1, n - 1
    while len(ans) < k:
        mul1, mul2 = nums1[i] * nums2[j], nums1[i - 1] * nums2[j - 1]
        if mul1 > mul2:
            ans.append(mul1)
            j -= 1
        else:
            ans.append(mul2)
            i -= 1
    ans.sort()
    return sum(ans[:k])
复杂度分析
  • 时间复杂度:排序数组的时间复杂度为 O(nlogn),遍历数组的时间复杂度为 O(n)。因此,总的时间复杂度为 O(nlogn)。
  • 空间复杂度:使用了常数个变量和一个长度为 k 的数组。因此,空间复杂度为 O(k)。