📅  最后修改于: 2023-12-03 15:26:11.347000             🧑  作者: Mango
给定两个长度相等的数组 nums1
和 nums2
,请返回它们的最小的对和,即最小的 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