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

7.力扣【三数之和】史上最清晰双指针解法!三步搞定,面试必看!

目录1. 题目解析1.1 题目描述15. 三数之和​示例 1手写图示解析2. 算法原理2.1 解法一排序 暴力枚举 利用 set 去重 —— O(n³)2.2 解法二排序 双指针 —— O(n²)步骤手写图示处理细节问题1. 去重2. 不漏优化点3. 编写代码总结OJ链接https://leetcode.cn/problems/3sum/description/1. 题目解析1.1 题目描述15. 三数之和​难度中等给你一个整数数组nums判断是否存在三元组[nums[i], nums[j], nums[k]]满足i ! j、i ! 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]。注意输出的顺序和三元组的顺序并不重要。手写图示解析原数组[-1, 0, 1, 2, -1, -4]→ 排序后[-4, -1, -1, 0, 1, 2]→ 尝试组合[-1, 0, 1]✔️[-1, 2, -1]✔️[0, 1, -1]×注对三元组[−1, 0, 1]和[−1, 2, −1]的判断以及[0, 1, −1]被划掉说明答案中不可包含重复的三元组即使数值相同顺序不同也视为重复。2. 算法原理2.1 解法一排序 暴力枚举 利用 set 去重 —— O(n³)思路​先对数组排序然后用三重循环枚举所有可能的三元组将符合条件的存入Set中去重最后转为列表返回。手写图示​排序后数组[-4, -1, -1, 0, 1, 2]→ 找到[-1, 0, 1]两次说明需要去重。→ 箭头指向O(n³)表示时间复杂度。缺点​ 时间复杂度高效率低下。2.2 解法二排序 双指针 —— O(n²)步骤排序将数组升序排列。固定一个数a即nums[i]。在该数后面的区间内利用“双指针算法”快速找到两个数的和等于-a即可。手写图示排序后数组[-4, -4, -1, 0, 0, 0, 1, 1, 4, 4, 5, 6]→ 固定i0值为-4left1right11目标值t4。→ 指针移动过程图示清晰。处理细节问题1. 去重找到一种结果之后left和right指针要跳过重复元素while(left right nums[left] nums[left - 1]) left; while(left right nums[right] nums[right 1]) right--;当使用完一次双指针算法之后i也需要跳过重复元素while(i n nums[i] nums[i - 1]) i;2. 不漏找到一种结果之后不要“停”缩小区间继续寻找。优化点固定数a 0因为数组已排序若a 0则后续所有数都大于0三数之和不可能为0可直接break。避免越界指针移动时需保证left right。3. 编写代码class Solution { // 时间复杂度 O(N^2) public ListListInteger threeSum(int[] nums) { ListListInteger ret new ArrayList(); // 1. 排序 Arrays.sort(nums); // 2. 利用双指针解决问题 int n nums.length; for(int i 0; i n; ) { if(nums[i] 0) break; // 小优化 int left i 1, right n - 1, target -nums[i]; while(left right) { int sum nums[left] nums[right]; if(sum target) right--; else if(sum target) left; else { // nums[i] nums[left] nums[right] ret.add(new ArrayListInteger(Arrays.asList(nums[i], nums[left], nums[right]))); left; right--; // 缩小区间继续寻找 // 去重: left right while(left right nums[left] nums[left - 1]) left; while(left right nums[right] nums[right 1]) right--; } } // 去重: i i; while(i n nums[i] nums[i - 1]) i; } return ret; } }总结核心思想排序 双指针将 O(n³) 优化至 O(n²)。关键点排序是基础。固定一个数双指针找另外两个数。去重处理三个地方i,left,right都要跳过重复元素。小优化nums[i] 0时直接 break避免无效计算。易错点去重逻辑必须严格否则会包含重复三元组。
http://www.rkmt.cn/news/1385732.html

相关文章:

  • 基于YOLO+InsightFace(ArcFace)的人脸识别检测系统
  • 如何快速解密QQ音乐加密文件:macOS用户的终极音频格式转换方案
  • 2026年高压开关测试仪优质产品推荐榜:便携式三相电能质量分析仪、开关参数测试仪、开关特性试验仪、手持式三相电能质量分析仪选择指南 - 优质品牌商家
  • 中兴光猫配置解密终极指南:5步掌握ZET-Optical-Network-Terminal-Decoder核心技术
  • Python PIL 画矩形框
  • 3分钟掌握城通网盘解析:告别缓慢下载的完整解决方案
  • 当游戏语言成为障碍:XUnity.AutoTranslator如何让外语游戏秒变中文
  • 2026年5月更新:如何甄选温州地区真正靠谱的商务笔记本生产合作伙伴 - 2026年企业推荐榜
  • 接水管游戏背后的状态传播引擎设计原理
  • 大模型降价的工程极限:从DeepSeek-V4-Pro看AI推理的成本革命
  • 给嵌入式新人的AUTOSAR入门指南:从MCU选型到主流方案(附Vector/EB/ETAS对比)
  • 吴恩达免费AI新课:真正适合普通人的课程
  • 3分钟拯救废稿:Midjourney一键锐化增强术(含--no watermarks规避+局部重绘锚点定位技巧)
  • 2026石家庄五粮液回收商家评测:石家庄生肖茅台酒回收/石家庄石家庄名酒回收电话/核心维度对比解析 - 优质品牌商家
  • 为什么92%的DeepSeek二次开发团队在6个月内遭遇交付延迟?——基于17个真实项目的技术债务归因分析
  • 鸿蒙非遗博览页面构建:技艺展示与分类导航模块详解
  • Lovable后端集成故障恢复SLA达标率从63%→99.99%:我们重构了3层适配器、替换2个SDK、自研1个协议转换网关(含SLO监控看板截图)
  • Midjourney云雾动态演化技巧(雾流速/雾密度/雾边界锐度三维调控法):内含仅限订阅用户获取的雾效时间轴Prompt模板库
  • 终极指南:如何用ComfyUI-Manager轻松管理你的AI工作流扩展库
  • Windows MongoDB安装与配置指南
  • 2026年马铃薯全粉设备可靠性评测及头部厂商盘点:滚筒干燥机/米粉辊筒干燥机/红薯全粉设备/芋头全粉设备/辊筒刮板干燥机/选择指南 - 优质品牌商家
  • 从LC振荡器到光效控制:一个极客的“水活化器”工程实践
  • YOLOv11医疗注射器剂量线目标检测数据集-200张-syringe-1_2
  • ESP32多任务水位监测:从Arduino到ESP-IDF的FreeRTOS实战
  • 光伏储能并网发电系统拓扑与控制策略研究(Simulink仿真实现)
  • 你不是在舒适区,你在漂移
  • TranslucentTB:让Windows任务栏焕然一新的5个实用技巧与终极配置指南
  • 3步解锁专业级MMD创作:Blender插件如何重塑二次元动画工作流
  • 终极艾尔登法环帧率解锁指南:轻松突破60FPS限制
  • 3分钟掌握HashCalculator:你的文件完整性守护专家