leecode第19天

15、三数之和
# 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,
# 同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
# 注意:答案中不可以包含重复的三元组。
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""hashtable = dict()lst=[]for i, num in enumerate(nums):if target - num in hashtable:lst.append(sorted([target-num, num,-target]))          hashtable[num] = ireturn lstdef threeSum(self, nums):"""寻找数组中所有和为0的不重复三元组。:param nums: 输入的整数数组:type nums: List[int]:return: 返回所有满足条件的三元组列表:rtype: List[List[int]]"""# 使用哈希表统计每个数字出现的次数hashtable = dict()for num in nums:if num in hashtable:hashtable[num] += 1else:hashtable[num] = 1lst = []# 检查是否存在三元组 [0, 0, 0]if 0 in hashtable and hashtable[0] >= 3:lst.append([0, 0, 0])# 获取哈希表中的所有键,并排序以优化后续处理hashtable_key = list(hashtable.keys())hashtable_key.sort()# 将数字分为负数和正数两部分nums_negative = []nums_positive = []for num in hashtable_key:if num < 0:nums_negative.append(num)elif num > 0:nums_positive.append(num)# 检查是否存在三元组 [0, -num, num]if 0 in hashtable and hashtable[0] >= 1:for num in nums_positive:if -num in nums_negative:lst.append(sorted([0, -num, num]))# 检查是否存在三元组 [num1, num2, num3],其中 num1 + num2 + num3 = 0# 处理正数部分:如果某个正数出现两次或以上,则将其加入临时列表if len(nums_positive) != 0:lst_temp_positive = []for key in nums_positive:if hashtable[key] >= 2:lst_temp_positive.append(key)nums_positive += lst_temp_positive# 处理负数部分:如果某个负数出现两次或以上,则将其加入临时列表if len(nums_negative) != 0:lst_temp_negative = []for key in nums_negative:if hashtable[key] >= 2:lst_temp_negative.append(key)nums_negative += lst_temp_negative# 遍历负数列表,调用 twoSum 方法寻找与当前负数相加为零的正数对for num in nums_negative:lst_temp = self.twoSum(nums_positive, -num)lst += lst_temp# 遍历正数列表,调用 twoSum 方法寻找与当前正数相加为零的负数对for num in nums_positive:lst_temp = self.twoSum(nums_negative, -num)lst += lst_temp# 去重:将结果列表中的三元组转换为集合后再转回列表lst = list(map(list, set(map(tuple, lst))))return lst
Yes
No
开始
构建哈希表
是否有至少三个0?
添加 0, 0, 0
分类负数和正数
处理 0, -num, num
处理重复数字
遍历负数调用 twoSum
遍历正数调用 twoSum
去重结果
返回结果

问题分析与优化建议

1. 潜在问题
  • 异常处理不足:代码中没有对输入参数 nums 进行类型检查,如果传入的不是列表或包含非整数元素,可能会引发运行时错误。
  • 边界条件未充分考虑:当输入数组为空或长度小于3时,代码虽然不会报错,但可以更明确地处理这种情况。
  • 去重逻辑效率较低:当前使用 set(map(tuple, lst)) 去重的方式虽然有效,但会增加额外的时间和空间开销。
2. 优化方向
  • 输入验证:在函数开头添加对输入参数的类型和内容检查,确保输入为整数列表。
  • 边界条件优化:明确处理输入数组为空或长度小于3的情况。
  • twoSum 方法实现:提供一个高效的实现,避免重复计算。
  • 去重逻辑优化:通过排序和跳过重复值的方式减少不必要的计算,同时避免使用集合去重。
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""seen = set()  # 用于存储已经访问过的数字pairs = []for num in nums:complement = target - num  # 计算当前数字的补数if complement in seen:  # 检查补数是否已经在集合中pairs.append(sorted([complement, num]))  # 如果存在,添加到结果中seen.add(num)  # 将当前数字添加到集合中return pairsdef threeSum(self, nums):"""寻找数组中所有和为0的不重复三元组。:param nums: 输入的整数数组:type nums: List[int]:return: 返回所有满足条件的三元组列表:rtype: List[List[int]]"""# 输入验证if not isinstance(nums, list) or not all(isinstance(x, int) for x in nums):raise ValueError("输入必须是整数列表")# 边界条件处理if len(nums) < 3:return []# 对数组进行排序nums.sort()result = []# 遍历数组,寻找三元组for i in range(len(nums) - 2):# 跳过重复元素if i > 0 and nums[i] == nums[i - 1]:continue# 使用双指针寻找两数之和left, right = i + 1, len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total == 0:result.append([nums[i], nums[left], nums[right]])# 跳过重复元素while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1elif total < 0:left += 1else:right -= 1return result

优化点总结

  1. twoSum 方法优化:使用双指针方法替代哈希表方法,确保正确处理重复元素。
  2. 去重逻辑优化:通过排序和跳过重复值的方式减少不必要的计算,避免使用集合去重。
  3. 边界条件处理:确保代码在处理边界条件时逻辑正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2109. 向字符串添加空格

2109. 向字符串添加空格 题目链接&#xff1a;2109. 向字符串添加空格 代码如下&#xff1a; class Solution { public:string addSpaces(string s, vector<int>& spaces) {string res "";int j 0;//直接遍历即可for (int i 0;i < spaces.size();i…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

CSRF跨站请求伪造——入门篇【DVWA靶场low级别writeup】

CSRF跨站请求伪造——入门篇 0. 前言1. 什么是CSRF2. 一次完整的CSRF攻击 0. 前言 本文将带你实现一次完整的CSRF攻击&#xff0c;内容较为基础。需要你掌握的基础知识有&#xff1a; 了解cookie&#xff1b;已经安装了DVWA的靶场环境&#xff08;本地的或云的&#xff09;&am…

BT-Basic函数之首字母R

BT-Basic函数之首字母R 文章目录 BT-Basic函数之首字母Rrandomizercallremoterenamereportreport clearreport fault syndromereport isreport level isreport outreport usingre‑savere‑storereturnrevision$rexitrinitrli$rndrotaterpmcrpsrun randomize 以下是这段英文的…

CentOS 7 如何挂载ntfs的移动硬盘

CentOS 7 如何挂载ntfs的移动硬盘 前言一、查看硬盘并尝试挂载(提示无法挂载)二、yum安装epel-release提示yum被锁定三、强行终止yum的进程四、yum安装epel-release完成五、yum安装ntfs-3g六、此时可正常挂载NTFS硬盘 前言 CentOS 7默认情况下是不支持NTFS的文件系统&#xff…

面试常考简单操作

参考文章 面试常考简单操作 快速排序归并排序Dijkstra自定义排序交替打印奇偶数冒泡排序插入排序堆排序欧几里得算法求最大公约数单例模式的双重校验LRU 快速排序 public class Solution {private static int partition(int[] arr, int left, int right) {int temp arr[left]…

2025图像处理和深度学习国际学术会议(IPDL 2025)

重要信息 官网&#xff1a;www.IPDL.xyz 时间&#xff1a;2025年4月11-13日 地点&#xff1a;中国-成都 简介 随着深度学习和图像处理技术的迅速发展&#xff0c;相关技术的应用逐渐渗透到各个行业&#xff0c;如医疗影像分析、自动驾驶、安防监控和智能制造等。这些应用的…

RNN万能逼近定理证明

RNN万能逼近定理证明 RNN原理图和数学表达式RNN的万能逼近定理及其证明证明 RNN原理图和数学表达式 s t U h t − 1 W x t b ∈ R D h s_tUh_{t-1}Wx_tb\in\mathbb{R}^{D_h} st​Uht−1​Wxt​b∈RDh​ s t ∈ R D h s_t\in\mathbb{R}^{D_h} st​∈RDh​ U ∈ R D h D h U\…

算力重构营销生态:广电数字人 “造星“ 运动背后的智能革命

一、数字人 "造星" 运动&#xff1a;广电行业的智能觉醒 当陕西广电的虚拟主播 "小雅" 在柞水县融媒体中心实现日更 100 秒新闻&#xff0c;当湖北广电的 "王丹" 从新闻主播转型为城市文化 IP&#xff0c;一场由算力驱动的数字人 "造星&qu…

大数据Spark(五十六):Spark生态模块与运行模式

文章目录 Spark生态模块与运行模式 一、Spark生态模块 二、Spark运行模式 Spark生态模块与运行模式 一、Spark生态模块 Spark 生态模块包括&#xff1a;SparkCore、SparkSQL、SparkStreaming、StructuredStreaming、MLlib 和 GraphX。与 Hadoop 相关的整个技术生态如下所示…

Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central

具体错误 [ERROR] Failed to execute goal on project datalink-resource: Could not resolve dependencies for project com.leon.datalink:datalink-resource:jar:1.0.0: Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central (https://repo.maven…

运营商在网状态查询API接口如何对接?

运营商在网状态查询 API 接口是一种能够让开发者通过编程方式查询手机号码在运营商网络中当前状态的应用程序接口。该接口是一组规范和协议&#xff0c;允许第三方开发者通过特定的编程方式与运营商的系统进行交互&#xff0c;以查询手机号码在运营商网络中的当前状态。 运营商…

【JavaScript】---- 数组的交集,并集,差集的实现,以及Set对象的交集,并集,差集的详细介绍和使用

1. 前言 数组的交集,并集,差集的实现。其实本质来说都不算难,但是 Set 类直接实现这些方法,所以我们先自己实现一下,然后再讲解一下 Set 类的相同方法。 2. intersection 交集 用数学公式,交集被表示为: A ∩ B = { x ∈ A ∣ x ∈ B } A \cap B = \{x \in A \mid x…

青铜与信隼的史诗——TCP与UDP的千年博弈

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章 契约之匣与自由之羽 熔岩尚未冷却的铸造台上&#xff0c;初代信使长欧诺弥亚将液态秘银倒入双生模具。左侧模具刻着交握的青铜手掌&#xff0c;右侧则是展开的隼翼纹章。当星辰…

SpringBoot的日志框架

目录 默认日志框架 日志配置 更换日志框架 排除默认Logback 引入目标日志框架 添加配置文件 logback.xml SpringBoot的核心设计宗旨是约定大于配置&#xff0c;很多框架功能都给你默认加载和配置完成供你使用&#xff0c;但这就要求使用者对框架有一定的理解和改造能力&am…

今日行情明日机会——20250403

今日涨停的主要行业方向分析&#xff08;2025-04-03&#xff09; 1. 贸易战相关概念&#xff08;13家涨停&#xff09; 细分领域&#xff1a;外贸、稀土永磁、中日韩贸易、物流、港口。代表个股&#xff1a; 外贸&#xff1a;爱丽家居、派斯林、迪生力&#xff08;受特朗普宣布…

Vue3使用富文本编辑器vue-quill 自定义图片上传、文件上传

一、引入依赖 // npm install vueup/vue-quill^1.2.0 quill^1.3.7"vueup/vue-quill": "^1.2.0","quill": "^1.3.7", 二、在vue文件中使用 <templete><div class"editor-container" v-if"show"><…

k8s pod重启顺序说明

在 Kubernetes 中&#xff0c;Pod 的重启顺序由 控制器类型 和 Pod 管理策略 共同决定。以下是不同场景下的详细规则和底层逻辑&#xff1a; 一、Pod 重启的触发场景 场景类型触发原因控制方容器崩溃重启容器进程退出&#xff08;如异常、OOM&#xff09;kubelet&#xff08;…

Modbus RTU与TCP通信示例

准备工作 安装 libmodbus 库 Linux (Debian/Ubuntu): sudo apt-get install libmodbus-dev Windows: 下载预编译库 libmodbus for Windows&#xff0c;并配置开发环境。 示例 1.Modbus RTU (串行通信) #include <stdio.h> #include <modbus/modbus.h> ​ int…

maven项目添加第三方JAR包

项目开发过程中&#xff0c;不可避免的需要用到一些maven库&#xff08;公共库、司库等&#xff09;中没有的冷门jar包依赖&#xff0c;这时&#xff0c;可以将这些第三方JAR包安装到本地maven仓库中&#xff0c;实现项目依赖的一致性。具体步骤如下&#xff1a; 1、下载jar包 …