当前位置: 首页 > news >正文

LeetCode 2918.数组的最小相等和:if-else

【LetMeFly】2918.数组的最小相等和:if-else

力扣题目链接:https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/

给你两个由正整数和 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
解释:无法使两个数组的和相等。

 

提示:

  • 1 <= nums1.length, nums2.length <= 105
  • 0 <= nums1[i], nums2[i] <= 106

解题方法:讨论

假设 n u m s 1 nums1 nums1的和为 s 1 s1 s1 n u m s 1 nums1 nums1中有 c 1 c1 c1 0 0 0 n u m s 2 nums2 nums2的和以及零的个数分别为 s 2 s2 s2 c 2 c2 c2,则有:

  • s 1 < s 2 + c 2 a n d c 1 = = 0 s1 < s2 + c2 and c1 == 0 s1<s2+c2andc1==0,说明 n u m s 2 nums2 nums2的和至少变为 s 2 + c 2 s2+c2 s2+c2,比 s 1 s1 s1大并且 s 1 s1 s1中没有 0 0 0可以使其和变大,直接返回 − 1 -1 1
  • s 1 + c 1 > s 2 a n d c s = = 0 s1 + c1 > s2 and cs == 0 s1+c1>s2andcs==0,同理,直接返回 − 1 -1 1
  • 否则,返回 m a x ( s 1 + c 1 , s 2 + c 2 ) max(s1 + c1, s2 + c2) max(s1+c1,s2+c2)

时空复杂度分析:

  • 时间复杂度 O ( l e n ( n u m s 1 ) + l e n ( n u m s 2 ) ) O(len(nums1) + len(nums2)) O(len(nums1)+len(nums2))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-05-10 12:07:54* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-10 19:00:36*/
typedef long long ll;class Solution {
public:long long minSum(vector<int>& nums1, vector<int>& nums2) {ll s1 = 0, s2 = 0;int c1 = 0, c2 = 0;for (int t : nums1) {s1 += t;c1 += t == 0;}for (int t : nums2) {s2 += t;c2 += t == 0;}if (s1 < s2 + c2 && c1 == 0 || s1 + c1 > s2 && c2 == 0) {return -1;}return max(s1 + c1, s2 + c2);}
};
Python
'''
Author: LetMeFly
Date: 2025-05-10 12:07:54
LastEditors: LetMeFly.xyz
LastEditTime: 2025-05-10 19:29:26
'''
from typing import List, Tupleclass Solution:def cal1(self, nums: List[int]) -> Tuple[int, int]:s, c = 0, 0for t in nums:if t:s += telse:c += 1return s, cdef minSum(self, nums1: List[int], nums2: List[int]) -> int:s1, c1 = self.cal1(nums1)s2, c2 = self.cal1(nums2)if s1 < s2 + c2 and c1 == 0 or s1 + c1 > s2 and c2 == 0:return -1return max(s1 + c1, s2 + c2)
Java
/** @Author: LetMeFly* @Date: 2025-05-10 12:07:54* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-10 19:32:19*/
class Solution {public long minSum(int[] nums1, int[] nums2) {long s1 = 0, s2 = 0;int c1 = 0, c2 = 0;for (int t : nums1) {s1 += t;if (t == 0) {c1++;}}for (int t : nums2) {s2 += t;if (t == 0) {c2++;}}if (s1 < s2 + c2 && c1 == 0 || s1 + c1 > s2 && c2 == 0) {return -1;}return Math.max(s1 + c1, s2 + c2);}
}
Go
/** @Author: LetMeFly* @Date: 2025-05-10 12:07:54* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-05-10 19:38:55*/
package mainfunc cal2918(a []int) (s int64, cnt int64) {for _, t := range a {if (t == 0) {cnt++} else {s += int64(t)}}return
}func minSum(nums1 []int, nums2 []int) int64 {s1, c1 := cal2918(nums1)s2, c2 := cal2918(nums2)if s1 < s2 + c2 && c1 == 0 || s1 + c1 > s2 && c2 == 0 {return -1}return max(s1 + c1, s2 + c2)
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.xdnf.cn/news/370351.html

相关文章:

  • OpenCv实战笔记(4)基于opencv实现ORB特征匹配检测
  • Web3 初学者的第一个实战项目:留言上链 DApp
  • 协议路由与路由协议
  • 【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
  • PXE_Kickstart_无人值守自动化安装系统
  • 物业企业绩效考核制度与考核体系
  • 前端弹性布局:用Flexbox构建现代网页的魔法指南
  • vue2 上传pdf,拖拽盖章,下载图片
  • 前端开发实战:用React Hooks优化你的组件性能
  • [C] 第10章 预处理命令
  • LeetCode热题100--240.搜索二维矩阵--中等
  • 达索MODSIM实施成本高吗?哪家服务商靠谱?
  • 思考:(linux) tmux 超级终端快速入门的宏观思维
  • Java—— 集合 List
  • 程序代码篇---Python视频流
  • JSON|cJSON 介绍以及具体项目编写
  • STM32CUBEIDE开发实战:ADC与UART应用
  • 网络原理(Java)
  • 使用python脚本连接SQL Server数据库导出表结构
  • 解决虚拟机挂起之后的网络问题
  • 鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK
  • 单片机-STM32部分:11、ADC
  • MCP项目实例 - client sever交互
  • Python+OpenCV打造AR/VR基础框架:从原理到实战的全链路解析
  • Kotlin高阶函数多态场景条件判断与子逻辑
  • Android 13 默认打开 使用屏幕键盘
  • macOS 15.4.1 Chrome不能访问本地网络
  • 深入解析C++11 auto 关键字:类型推导的现代实践
  • 青藏高原七大河流源区径流深、蒸散发数据集(TPRED)
  • PCB设计实践(十二)PCB设计电容选型:功能、材质、规则