📌  相关文章
📜  可以从两个数组前面删除的最大元素,使得它们的总和最多为 K(1)

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

双指针法解题思路

题目描述:给出两个已排序数组,和一个整数 $K$,选出两个数组中前 $K$ 小的数,要求两个数的和最大。

解题思路:因为两个数组本身是已排好序的,我们可以假设我们选了数组 A 中的第 $i$ 个数和数组 B 中的第 $j$ 个数作为最终结果,那么选出前 $i + j$ 小的数必然包括了数组 A 的前 $i$ 个数和数组 B 的前 $j$ 个数。所以问题转化成了找出一个最大的 $i+j$,满足 $a[0]+a[1]+...+a[i-1]+b[0]+b[1]+...+b[j-1]≤K$。

我们可以采用双指针的思想,令 $i=0$,$j=0$,对于每个 $i$,在不超过 $K$ 的情况下让 $j$ 尽可能地增大,更新答案,最终得到的答案即为所求。

代码实现:

def max_sum_two_arrays(nums1, nums2, k):
    i, j, res = 0, 0, 0
    while i < len(nums1) and j < len(nums2) and i + j <= k:
        if nums1[i] < nums2[j]:
            res += nums2[j]
            j += 1
        else:
            res += nums1[i]
            i += 1
    while i < len(nums1) and i + j <= k:
        res += nums1[i]
        i += 1
    while j < len(nums2) and i + j <= k:
        res += nums2[j]
        j += 1
    return res

时间复杂度:$O(k)$

空间复杂度:$O(1)$

以上是本题的解题思路和代码,采用了双指针的方法,时间复杂度为 $O(k)$,空间复杂度为 $O(1)$。