列表

详情


100102. 数组的最小相等和

给你两个由正整数和 0 组成的数组 nums1nums2

你必须将两个数组中的 所有 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
解释:无法使两个数组的和相等。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long minSum(vector<int>& nums1, vector<int>& nums2) { } };

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 }

上一题