📌  相关文章
📜  根据给定条件从两个给定数组中最大化一对值(1)

📅  最后修改于: 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数组的长度。