题目描述
题目
算法思路
题目要求将两个数组中的所有0都将被替换成严格正整数,故最小数组元素和,即将数组中的所有0都变成1。而判断两个数组中所有元素之和能否相等,我们可以将两个数组中所有的0都变成1,此时,如果数组元素和较小的数组,其原本含有0的数量是大于0的,那么该数组一定可以改变原本的0,使其元素和等于另一个数组,故另一个数组的元素和即为最小相等和;而如果此时数组元素和较小的数组,其原本含有0的数量是等于0的(即原本数组中不含有0),那么就无法使两数组元素和相等。而如果将数组中的0变为1后,两个数组的元素和已经相等了,那么该元素和就是最小相等和。
代码实现
public long minSum(int[] nums1, int[] nums2) {
// 记录两个数组的元素和
long sum1=0,sum2=0;
// 记录两个数组中,0元素的个数
int count1=0,count2=0;
// 分别统计两个数组0元素的个数,以及将0元素变为1之后的数组和
// 最后进行判断
for(int i:nums1){
if(i==0) {
count1++;
sum1+=1;
}
else sum1+=i;
}
for(int i:nums2){
if(i==0) {
count2++;
sum2+=1;
}
else sum2+=i;
}
if(sum1==sum2) return sum1;
else if(sum1>sum2){
if(count2>0) return sum1;
else return -1;
}
else {
if(count1>0) return sum2;
else return -1;
}
}
时间复杂度O(n),空间复杂度O(1)。