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

LeetCode 热题100 - 6. 三数之和(Java 题解)

LeetCode 热题100 - 6. 三数之和(Java 题解)

题目链接

https://leetcode.cn/problems/3sum/

难度

中等

题目描述

给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]]

满足 i != j、i != k、j != k,同时满足 nums[i] + nums[j] + nums[k] == 0

请你返回所有和为 0 且不重复的三元组。

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

解题思路

本题最优解法:排序 + 双指针,核心思路如下:

  1. 先排序

    排序是去重和双指针的基础。

  2. 遍历固定第一个数 nums [i]

    把问题转化为:在 i 后面找两数之和等于 -nums[i]

  3. 对 i 之后的区间使用双指针

    • left = i + 1
    • right = 数组末尾
    • 根据两数之和与目标值的大小移动指针
  4. 关键:去重

    • 对 i 去重:nums[i] == nums[i-1] 跳过
    • 对 left、right 去重:找到答案后跳过重复元素

排序 + 双指针让时间复杂度从暴力 O(n3) 降到 O(n2)。

复杂度分析

  • 时间复杂度:O(n2)

    排序 O(nlogn) + 遍历 O(n) + 双指针 O(n)

  • 空间复杂度:O(logn) ~ O(n)

    主要是排序占用的空间

解题代码(Java)

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();int length = nums.length;// 排序:为了双指针 + 去重Arrays.sort(nums);for (int i = 0; i < length; i++) {// 对第一个数去重if (i > 0 && nums[i - 1] == nums[i]) {continue;}// 目标:两数之和 = -nums[i]int temp = -nums[i];int left = i + 1, right = length - 1;while (left < right) {int sum = nums[left] + nums[right];if (sum == temp) {// 找到一组解result.add(Arrays.asList(nums[i], nums[left], nums[right]));left++;right--;// 对 left 去重while (left < right && nums[left - 1] == nums[left]) {left++;}// 对 right 去重while (left < right && nums[right + 1] == nums[right]) {right--;}} else if (sum < temp) {// 和太小,左指针右移left++;} else {// 和太大,右指针左移right--;}}}return result;}
}

代码解释

  1. 排序

    让数组有序,才能用双指针逼近目标值,同时方便去重。

  2. 遍历第一个数 i

    把三数之和转为两数之和问题。

  3. 去重(最关键)

    • i 重复直接跳过
    • 找到答案后,leftright 也要跳过重复值保证最终结果不重复。
  4. 双指针逼近

    • 和偏小 → left++
    • 和偏大 → right--

示例

输入:nums = [-1,0,1,2,-1,-4]

排序后:[-4,-1,-1,0,1,2]

  • i=0(-4)→ 目标 4 → 无满足条件

  • i=1(-1)→ 目标 1

    left=2, right=5 → -1+2=1 → 记录

    [-1,-1,2]
    

    left=3, right=4 → 0+1=1 → 记录

    [-1,0,1]
    
  • i=2(-1)→ 重复,跳过

  • 最终结果:[[-1,-1,2],[-1,0,1]]

易错点

  1. 必须先排序,否则无法双指针 + 去重
  2. 三处去重缺一不可,否则答案重复
  3. 找到答案后要同时移动 left 和 right
  4. 去重循环必须带上 left < right 防止越界

总结

本题是排序 + 双指针的最经典面试题,核心是转化为两数之和 + 严格去重

http://www.jsqmd.com/news/640643/

相关文章:

  • 别让小数点毁了你的模型:深度解析ArcSWAT中forrt1:error(65)报错的数据根源与修复工具
  • Cisco Secure Network Analytics Virtual 7.6.0 - 领先的网络检测和响应 (NDR) 解决方案
  • 运维工具箱开发踩坑复盘:怎么把Python软件打包成 Win7 也能直接用的 EXE
  • ESP-NOW与Arduino的完美邂逅:ESP32S3低功耗无线通信全解析
  • Guohua Diffusion 一键部署与Java微服务集成指南
  • 2026年OpenClaw如何搭建?云端7分钟零技术指南+大模型APIKey配置、Skill集成方法
  • 5分钟解决Windows与Office激活难题:智能激活脚本完全指南
  • 【我的Android进阶之旅】异常:java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/xxx/R$id;
  • KMS_VL_ALL_AIO终极指南:一站式Windows和Office激活解决方案
  • 生态水文分析实战:如何用InVEST模型评估你家乡的产水量?以长江流域为例
  • 【应用层-DHCP动态主机配置协议】
  • BMS软件架构实战 — 高压互锁(HVIL)检测电路的信号采集与诊断策略
  • 2026 年合规 NMN 十大品牌榜单|FDA+GMP+SGS三重认证,安全可溯源 - 资讯焦点
  • AMD Ryzen SDT调试工具:精准硬件控制与系统优化的终极解决方案
  • 从分类到分割:深入浅出图解CAM如何成为弱监督语义分割的‘火种’
  • 京东抢购助手终极使用指南:轻松秒杀心仪商品的全流程解析
  • 【AI】《Autonomous Vehicles Learning Notes》
  • 算法训练营第一天、二分查找
  • 2026年4月百达翡丽官方售后网点亲测核验报告|实地踩坑实录+防坑指南(含迁址/新开) - 亨得利官方服务中心
  • 深度解析瓶装水贴牌加工:核心原理与行业实践 - 速递信息
  • 云原生入门误区:新手常踩的3个认知陷阱
  • 掌握The Platform测试策略:Jest与React Testing Library实用指南
  • 深入解析51单片机D/A转换:从原理到实战应用
  • ROS2 实时性能调优实战:从内核到应用的确定性延迟达成
  • 20260414 找工作的感受 - 枝-致
  • 上门做饭系统的数据可视化大屏:基于Echarts的实时业务监控与源码剖析
  • 第12篇:AUTOSAR方法论入门:从手写代码到配置驱动的开发思维转变
  • Gold-YOLO:从论文到实践,深入剖析其高效目标检测的聚合-分发机制
  • 加拿大留学申请成功率提升秘籍:新航道天津学校专业护航 - 品牌2025
  • 2026最新全国下水道疏通TOP8机构揭晓!帮你一次选对、不踩坑 - 深度智识库