leetcode 2918. 数组的最小相等和 中等
给你两个由正整数和 0
组成的数组 nums1
和 nums2
。
你必须将两个数组中的 所有 0
替换为 严格 正整数,并且满足两个数组中所有元素的和 相等 。
返回 最小 相等和 ,如果无法使两数组相等,则返回 -1
。
示例 1:
输入:nums1 = [3,2,0,1,0], nums2 = [6,5,0] 输出:12 解释:可以按下述方式替换数组中的 0 : - 用 2 和 4 替换 nums1 中的两个 0 。得到 nums1 = [3,2,2,1,4] 。 - 用 1 替换 nums2 中的一个 0 。得到 nums2 = [6,5,1] 。 两个数组的元素和相等,都等于 12 。可以证明这是可以获得的最小相等和。
示例 2:
输入:nums1 = [2,0,2,0], nums2 = [1,4] 输出:-1 解释:无法使两个数组的和相等。
提示:
1 <= nums1.length, nums2.length <= 10^5
0 <= nums1[i], nums2[i] <= 10^6
分析:不难想到,将数组中的所有 0 变为 1 能够使该数组所有元素的和最小。令 sum1, sum2 分别为 nums1,nums2 的不为零元素之和,cnt1,cnt2 为两个数组为 0 的元素数量,则两个数组可以达到的最小和为:sum1+cnt1,sum2+cnt2。
当两个数组至少都存在 1 个 0 时,一定存在答案,且答案为两个最小和的较大值。
当某个数组中不存在 0 时,如果另一个数组可达的最小和大于此数组的和,由于没有办法使此数组的和变大使得两个数组的和相等,返回-1.
long long minSum(int* nums1, int nums1Size, int* nums2, int nums2Size) {long long sum1 = 0, sum2 = 0;int zero1 = 0, zero2 = 0;for (int i = 0; i < nums1Size; i++) {sum1 += nums1[i];if (nums1[i] == 0) {sum1 += 1;zero1++;}}for (int i = 0; i < nums2Size; i++) {sum2 += nums2[i];if (nums2[i] == 0) {sum2 += 1;zero2++;}}if ((zero1 == 0 && sum2 > sum1) || (zero2 == 0 && sum1 > sum2)) {return -1;}return sum1 > sum2 ? sum1 : sum2;
}