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