class Solution {
public:
long long minSum(vector<int>& nums1, vector<int>& nums2) {
}
};
100102. 数组的最小相等和
给你两个由正整数和 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 <= 105
0 <= nums1[i], nums2[i] <= 106
原站题解
python3 解法, 执行用时: 152 ms, 内存消耗: 33.4 MB, 提交时间: 2023-10-30 07:41:52
class Solution: def minSum(self, nums1: List[int], nums2: List[int]) -> int: s1 = sum(max(x, 1) for x in nums1) s2 = sum(max(x, 1) for x in nums2) zero1 = 0 in nums1 zero2 = 0 in nums2 if zero1 and not zero2 and s1 > s2 or \ not zero1 and zero2 and s1 < s2 or \ not zero1 and not zero2 and s1 != s2: return -1 return max(s1, s2)
java 解法, 执行用时: 3 ms, 内存消耗: 57.1 MB, 提交时间: 2023-10-30 07:41:37
class Solution { public long minSum(int[] nums1, int[] nums2) { long s1 = 0; boolean zero1 = false; for (int x : nums1) { if (x == 0) { zero1 = true; s1++; } else { s1 += x; } } long s2 = 0; boolean zero2 = false; for (int x : nums2) { if (x == 0) { zero2 = true; s2++; } else { s2 += x; } } if ((zero1 && !zero2 && s1 > s2) || (!zero1 && zero2 && s1 < s2) || (!zero1 && !zero2 && s1 != s2)) { return -1; } return Math.max(s1, s2); } }
cpp 解法, 执行用时: 156 ms, 内存消耗: 127.8 MB, 提交时间: 2023-10-30 07:41:22
class Solution { public: long long minSum(vector<int>& nums1, vector<int>& nums2) { long long s1 = 0; bool zero1 = false; for (int x : nums1) { if (x == 0) { zero1 = true; s1++; } else { s1 += x; } } long long s2 = 0; bool zero2 = false; for (int x : nums2) { if (x == 0) { zero2 = true; s2++; } else { s2 += x; } } if ((zero1 && !zero2 && s1 > s2) || (!zero1 && zero2 && s1 < s2) || (!zero1 && !zero2 && s1 != s2)) { return -1; } return max(s1, s2); } };
golang 解法, 执行用时: 120 ms, 内存消耗: 8.4 MB, 提交时间: 2023-10-30 07:41:09
func minSum(nums1, nums2 []int) int64 { s1 := int64(0) zero1 := false for _, x := range nums1 { if x == 0 { zero1 = true s1++ } else { s1 += int64(x) } } s2 := int64(0) zero2 := false for _, x := range nums2 { if x == 0 { zero2 = true s2++ } else { s2 += int64(x) } } if zero1 && !zero2 && s1 > s2 || !zero1 && zero2 && s1 < s2 || !zero1 && !zero2 && s1 != s2 { return -1 } return max(s1, s2) } func max(a, b int64) int64 { if b > a { return b }; return a }