📅  最后修改于: 2023-12-03 14:55:40.026000             🧑  作者: Mango
给定两个长度分别为n和m的数组nums1和nums2,以及一个整数k。你需要从两个数组中分别选出最多k个数,使得这k个数的和最大。请输出这个最大和。
将数组nums1排序,并将数组nums2排序。从两个数组中分别选出i和j个数,其中i+j=k。当i或j小于k时,取值范围为0到min(k, n/m)。因为任何大小超过k的组合都包含了大小小于k的组合的元素,所以在小于等于k的情况下进行组合。
对于每一对i和j,我们需要找出它们分别在数组nums1和nums2中的前i个元素的和以及前j个元素的和,然后将这两个数字相加,得到它们的总和。由于我们已经对数组进行了排序,所以我们可以通过扫描数组来计算前缀和。通过比较所有可能对的总和,我们可以找到最大的k个数的总和。
def maxSum(nums1: List[int], nums2: List[int], k: int) -> int:
n, m = len(nums1), len(nums2)
pre_sum1, pre_sum2 = [0], [0]
for i in range(n):
pre_sum1.append(pre_sum1[-1]+nums1[i])
for j in range(m):
pre_sum2.append(pre_sum2[-1]+nums2[j])
ans = 0
for i in range(min(k, n)+1):
j = min(k-i, m)
if j > 0:
ans = max(ans, max(pre_sum1[i])+max(pre_sum2[j]))
for j in range(min(k, m)+1):
i = min(k-j, n)
if i > 0:
ans = max(ans, max(pre_sum1[i])+max(pre_sum2[j]))
return ans
该算法时间复杂度为O(min(n,m)k),其中n为nums1数组的长度,m为nums2数组的长度。