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

【LeetCode刷题】三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 10^5

解题思路:

  1. 排序数组:先对数组进行排序,以便后续利用双指针缩小范围,同时方便去重。
  2. 固定第一个数:遍历数组,将当前元素作为三元组的第一个数 nums[i]。若 nums[i] > 0,则后续元素均大于 0,和不可能为 0,直接终止循环。
  3. 双指针找另外两个数:对于每个 nums[i],使用左指针 l = i+1 和右指针 r = len(nums)-1,计算三者的和:
    • 若和为 0,记录该三元组,并移动指针跳过重复元素(避免重复三元组)。
    • 若和小于 0,左指针右移(增大和)。
    • 若和大于 0,右指针左移(减小和)。
  4. 去重处理:在遍历第一个数和移动双指针时,均需跳过重复元素,确保结果中无重复三元组。

Python代码:

from typing import Listclass Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:n = len(nums)if n < 3:return []nums.sort()res = []for i in range(n):# 若当前数大于0,后续数更大,和不可能为0,直接breakif nums[i] > 0:break# 去重:避免第一个数重复导致的重复三元组if i > 0 and nums[i] == nums[i-1]:continuel, r = i + 1, n - 1while l < r:total = nums[i] + nums[l] + nums[r]if total == 0:res.append([nums[i], nums[l], nums[r]])# 去重:避免左右指针重复元素导致的重复三元组while l < r and nums[l] == nums[l + 1]:l += 1while l < r and nums[r] == nums[r - 1]:r -= 1l += 1r -= 1elif total < 0:l += 1else:r -= 1return resif __name__ == "__main__":# 处理输入(格式如:nums = [-1,0,1,2,-1,-4])input_str = input().strip()# 提取数组部分并转换为整数列表nums = eval(input_str.split("=")[1].strip())# 实例化类并调用方法solution = Solution()result = solution.threeSum(nums)# 输出结果print(result)

LeetCode提交代码:

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:from typing import Listn = len(nums)if n < 3:return []nums.sort()res = []for i in range(n):# 若当前数大于0,后续数更大,和不可能为0,直接breakif nums[i] > 0:break# 去重:避免第一个数重复导致的重复三元组if i > 0 and nums[i] == nums[i-1]:continuel, r = i + 1, n - 1while l < r:total = nums[i] + nums[l] + nums[r]if total == 0:res.append([nums[i], nums[l], nums[r]])# 去重:避免左右指针重复元素导致的重复三元组while l < r and nums[l] == nums[l + 1]:l += 1while l < r and nums[r] == nums[r - 1]:r -= 1l += 1r -= 1elif total < 0:l += 1else:r -= 1return res

总结

题目要求在整数数组nums中找到所有不重复的三元组[nums[i], nums[j], nums[k]],满足i≠j≠k且三数之和为0。采用排序+双指针法:先排序数组,遍历固定第一个数,用双指针在剩余范围搜索另外两个数。通过跳过重复元素避免重复解。时间复杂度为O(n²),空间复杂度为O(1)。示例:输入[-1,0,1,2,-1,-4],输出[[-1,-1,2],[-1,0,1]]。关键步骤包括排序、双指针移动及去重处理。

http://www.dtcms.com/a/605857.html

相关文章:

  • 【每天一个AI小知识】:什么是线性回归?
  • 昆明网站建设优化外贸建站公司排名
  • 做房产的网站排名天津建设工程信息网中标公告
  • word表格操作疑难杂症处理
  • 网站建设收费标准讯息学it学费大概多少钱
  • 第一个Python金融爬虫
  • 如何在线修改ORACLE 临时文件
  • 【Oracle APEX开发小技巧17】交互式网格操作按钮根据条件/状态设置能否被点击生效
  • 淘宝扭蛋机小程序:电商娱乐化赛道的机遇挖掘与风险防控
  • 【AI大模型技术】8.大模型文本理解与生成
  • vue前端静态页面部署
  • 视频直播网站开发流程滁州做网站电话号码
  • 怎样快速仿做网站有哪些企业官网做得比较好
  • CameraBag Mac英文 照片视频滤镜编辑工具
  • 使用Claude Code进行编程——国内用户使用指南
  • (17)python开发经验 --- Python查找dll exe依赖缺失
  • (第五篇)Spring AI 基础入门之嵌入模型与向量基础:AI 理解世界的方式
  • 基于RTDS与DIgSILENT联合仿真的电力系统薄弱点识别及光伏控制策略优化
  • 在俄罗斯用钱让女性做h事情的网站wordpress post模板
  • 网站地区分站系统自助注册搭建网站
  • 自适应残差卷积网络 + 斑马优化:让图像更清晰的“智慧组合“
  • 图形化android可视化开机观测工具bootchart
  • 网站建设网站推广服务公司阿里云买域名
  • 时间复杂度(按增长速度从低到高排序)包括以下几类,用于描述算法执行时间随输入规模 n 增长的变化趋势:
  • 免费如何做网页或网站asp网站部署
  • 基于YOLO11-Hyper的油罐车类型识别与状态检测系统_1
  • 时间的幻觉:当你不在时,宇宙按下暂停键
  • AI入门知识之RAG技术树全景解析:从基础架构到智能演进的演进路径
  • 做网站的数据库万维设计
  • 马尾网站建设郑州网络推广哪家厉害