📜  数组中最小的对和(1)

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

数组中最小的对和

问题描述

给定两个长度相等的数组 nums1nums2,请返回它们的最小的对和,即最小的 nums1[i] + nums2[j],其中 0 ≤ i, j < nums1.length。

示例输入输出

输入: nums1 = [1,2], nums2 = [2,3]

输出: 3

解释: 两个数组中各选一个数相加,可能的组合如下:

1+2 = 3
1+3 = 4
2+2 = 4
2+3 = 5

因此最小的对和为 3。

解决方案

我们可以考虑将数组 nums1 排序,并对数组 nums2 中的每一个元素,在 nums1 中二分查找最接近它的数,然后求和取最小值。

如下为代码实现:

def minPairSum(nums1, nums2):
    nums1.sort()
    ans = float('-inf')
    for num in nums2:
        idx = bisect.bisect_left(nums1, num)
        if idx < len(nums1):
            ans = max(ans, nums1[idx] + num)
        if idx > 0:
            ans = max(ans, nums1[idx - 1] + num)
    return ans

其中,bisect.bisect_left() 方法是 Python 内置的二分查找方法,用于找到插入位置,其时间复杂度为 $O(\log n)$。

时间复杂度

排序时间复杂度 $O(n \log n)$,二分查找时间复杂度为 $O(m \log n)$,其中 $m$ 为数组 nums2 的长度,因此总时间复杂度为 $O(n \log n + m \log n)$。

空间复杂度

除了排序所需要的额外空间外,空间复杂度为 $O(1)$。

完整代码
import bisect

def minPairSum(nums1, nums2):
    nums1.sort()
    ans = float('-inf')
    for num in nums2:
        idx = bisect.bisect_left(nums1, num)
        if idx < len(nums1):
            ans = max(ans, nums1[idx] + num)
        if idx > 0:
            ans = max(ans, nums1[idx - 1] + num)
    return ans