题目链接2918. 数组的最小相等和 - 力扣LeetCode题目描述给你两个由正整数和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 解释无法使两个数组的和相等。解题思路问题理解给定两个数组nums1和nums2可以将数组中的0替换为任意正整数。目标是通过替换0使得两个数组的元素和相等求这个相等的和的最小值。如果无法使两个数组的和相等则返回-1。关键思路计算数组和对于每个数组计算其元素和其中0可以替换为1最小值因此每个0贡献1到总和中。检查可行性如果一个数组没有0且其和小于另一个数组的和则无法通过替换0来平衡因为只能增加有0数组的和。否则可以通过替换0来平衡两个数组的和。最小和平衡后的和是两个数组和中的较大值因为较小的和需要通过替换0增加到较大的和。算法流程使用calc方法计算每个数组的和和是否包含0。检查是否可以平衡两个数组的和。返回平衡后的和即较大的和。题解代码classSolution{// 定义一个内部记录类Pair包含sum和zero两个字段privaterecordPair(longsum,booleanzero){}publiclongminSum(int[]nums1,int[]nums2){// 计算两个数组的sum和是否包含0Pairp1calc(nums1);Pairp2calc(nums2);// 如果某个数组没有0且其sum小于另一个数组的sum则无法平衡if(!p1.zerop1.sump2.sum||!p2.zerop2.sump1.sum){return-1;}// 返回两个sum中的较大值returnMath.max(p1.sum,p2.sum);}// 计算数组的sum和是否包含0privatePaircalc(int[]nums){longsum0;booleanzerofalse;for(intx:nums){if(x0){zerotrue;// 标记存在0sum;// 0可以替换为1所以sum加1}else{sumx;// 非0直接累加}}returnnewPair(sum,zero);}}复杂度分析时间复杂度计算两个数组的和和是否包含0O(n m)其中n和m分别是nums1和nums2的长度。比较和检查可行性O(1)。总时间复杂度O(n m)。空间复杂度使用了常数空间存储Pair对象和临时变量。总空间复杂度O(1)。