📌  相关文章
📜  给定两个数组的最小总和(1)

📅  最后修改于: 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$。