📌  相关文章
📜  最小化值最大为K的替换,以使两个给定数组的总和相等(1)

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

最小化值最大为K的替换,以使两个给定数组的总和相等

简介

给定两个长度为 n 的数组 nums1 和 nums2,它们的元素均为非负整数。先给 nums1 中所有元素 + k,其中 k 是一个非负整数,然后选出一个下标 i,将 nums1[i] 替换成 nums2[i],使得两个数组的和相等。请你找到将 nums1 中的一个元素替换成 nums2 中的元素,使得两个数组的和相等,并且找到最小化后的替换值的最大值 k。如果无法找到这样的下标 i,则返回 -1。

思路

先将 nums1 中所有的元素 +k,也就是将所有的元素都增加k。

那么现在我们相当于是要在新的 nums1 和 nums2 上找到一对数,分别在两个数组中替换,使得最终两个数组的和相等,并且替换后最小化值最大。

在两个数组中分别找到最大值和最小值,设为 max1 和 min2。此时,如果替换 max1,那么新的值为 min2 + k,但是数组的和也会增加 (min2 - max1)。因此,如果 (min2 - max1) > k,那么就无法使得两个数组的和相等。因此,我们只需要找到最小的 k,使得 (min2 - max1) <= k,就可以保证存在一组替换方式能够使得两个数组的和相等了。

代码实现
def minMaxValue(nums1, nums2):
    n = len(nums1)
    k = max(nums2) - min(nums1)
    for i in range(n):
        nums1[i] += k
    max1 = max(nums1)
    min2 = min(nums2)
    if min2 > max1:
        return -1
    return min2 - k
复杂度分析

由于我们只需要遍历一遍数组,因此时间复杂度为 O(n)。所需的额外空间也只是常数级别的,因此空间复杂度为 O(1)。

总结

本题是一道比较简单的贪心题目。可以从最终要求入手,先找到最小化值最大的 k,然后在两个数组中找到能够替换的一对数。