📅  最后修改于: 2023-12-03 15:11:39.420000             🧑  作者: Mango
在这个问题中,我们将给定两个长度分别为 $m$ 和 $n$ 的数组。我们需要从这两个数组中选出一个数对 $(a,b)$,使得它们的和 $a+b$ 的值最小。求这个最小的和。
直接暴力的解法是遍历两个数组中所有的数对,找到它们的和的最小值,所需时间复杂度为 $O(mn)$。但是,这种解法的时间复杂度太高,不适用于大规模的数据。
使用双指针算法可以将时间复杂度降低到 $O(m+n)$。我们可以先将两个数组从小到大排序,然后从头开始指向两个数组的元素,每次将两个指针指向的元素相加并比较,然后移动较小的那个指针。当一个指针超过了数组的长度时,我们就可以结束了。
下面是 Python 代码实现:
def min_sum(nums1, nums2):
nums1.sort()
nums2.sort()
m, n = len(nums1), len(nums2)
res = float('inf')
i, j = 0, 0
while i < m and j < n:
res = min(res, nums1[i]+nums2[j])
if nums1[i] < nums2[j]:
i += 1
else:
j += 1
while i < m:
res = min(res, nums1[i]+nums2[n-1])
i += 1
while j < n:
res = min(res, nums1[m-1]+nums2[j])
j += 1
return res
>>> nums1 = [1, 3, 5]
>>> nums2 = [2, 4, 6]
>>> min_sum(nums1, nums2)
3
上述示例中,数组 $nums1$ 中的数对是 $(1,2)$、$(1,4)$ 和 $(1,6)$,数组 $nums2$ 中的数对是 $(3,2)$、$(3,4)$ 和 $(3,6)$。这些数对的和为 $3$、$5$ 和 $7$,其中 $3$ 是最小的和,因此函数返回 $3$。