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

【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针

LeetCode 15. 三数之和

📌 题目描述

题目级别:中等

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

  • 示例 1:
    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]

💡 破题思路:排序 + 固定一端 + 双指针夹逼

这道题如果用暴力三层 for 循环,时间复杂度是O(N3)O(N^3)O(N3),绝对会超时。而且暴力法极难处理“不重复的三元组”这个要求。

最高效的解法是降维打击:把O(N3)O(N^3)O(N3)降为O(N2)O(N^2)O(N2)
核心流程如下:

  1. 先排序(极其关键)
    排序是双指针夹逼的前提,也是轻松跳过重复元素的基石。
  2. 固定第一个数 (nums[i])
    遍历数组,将nums[i]作为三元组中最小的那个数固定下来。此时问题就变成了:在i之后的数组中,寻找两个数,使它们的和等于-nums[i](这就是经典的《两数之和 II》问题)。
  3. 双指针向中间夹逼
    设左指针l = i + 1,右指针r = n - 1
    • 如果sum == 0,记录答案,并让lr同时向中间收缩。
    • 如果sum < 0,说明总和太小,左指针l右移以增大数值。
    • 如果sum > 0,说明总和太大,右指针r左移以减小数值。
  4. 地狱级细节:三重去重
    • 去重 1 (外层):如果当前的nums[i]和上一个固定过的nums[i-1]一样,直接continue跳过,因为同样的开头一定会搜出同样的结果。
    • 去重 2 & 3 (内层):当找到一组正确答案后,左指针l必须跳过身后所有与之重复的元素,右指针r也必须跳过身前所有与之重复的元素,否则三元组会重复!

💻 C++ 代码实现 (最强双指针模板)

classSolution{public:vector<vector<int>>threeSum(vector<int>&nums){intn=nums.size();// 1. 必须先排序,为双指针夹逼和去重打下基础sort(nums.begin(),nums.end());vector<vector<int>>res;// 2. 遍历数组,固定第一个数 nums[i]for(inti=0;i<n;i++){// 去重点 1:如果固定的这个数和上一次固定的数一样,直接跳过,防止产生重复三元组if(i&&nums[i]==nums[i-1])continue;// 定义左右双指针intl=i+1,r=n-1;// 3. 双指针开始向中间夹逼while(l<r){intsum=nums[i]+nums[l]+nums[r];if(sum==0){// 找到一组符合条件的解,塞入结果集res.push_back({nums[i],nums[l],nums[r]});// 去重点 2:左指针跳过所有重复元素while(l<r&&nums[l]==nums[l+1])l++;// 去重点 3:右指针跳过所有重复元素while(l<r&&nums[r]==nums[r-1])r--;// 双双往中间聚拢一步,寻找下一个潜在的组合l++,r--;}// sum 太小,左指针右移找更大的数elseif(sum<0)l++;// sum 太大,右指针左移找更小的数elser--;}}returnres;}};
http://www.jsqmd.com/news/722019/

相关文章:

  • Claude Opus 4.7、GPT-5.5 与 DeepSeek-V4-Pro 对比分析
  • 2026年q2重庆地区废铁金属回收公司排行盘点:重庆废旧机械设备回收,重庆废钢金属回收,排行一览! - 优质品牌商家
  • 别再让Win10虚拟机卡成PPT!这18个保姆级优化设置,让你的VMware/VirtualBox飞起来
  • 如何在DbGate中快速连接MySQL数据库:完整配置指南与实用技巧
  • PPTist终极指南:三步掌握免费在线PPT制作,告别PowerPoint依赖
  • Windows字体渲染革命:5分钟掌握MacType终极配置技巧
  • 从论文模板到实战:手把手教你用TeXstudio配置中文写作环境(XeLaTeX + UTF-8)
  • 磨削电主轴热误差预测与故障机理【附代码】
  • 避坑指南:Keil uVision5新建工程到生成HEX文件的完整流程(含常见报错解决)
  • 避坑指南:手把手教你用Python 3.7和PyTorch 1.12.1搞定SAGA(CVPR 2023)3D点云分割环境配置
  • JBoltAI V4.3发布:AgentRAG让企业AI真正
  • Spring Cloud项目日志改造实战:从logback迁移到log4j2,顺便搞定异步线程TraceId丢失的坑
  • Cursor Pro破解工具终极指南:一键激活AI编程助手永久免费使用教程
  • 从门禁卡到5G通信:国密算法SM1/SM4/SM7/ZUC在你身边的隐藏应用图鉴
  • 如何永久保存微信聊天记录:WeChatMsg终极指南
  • 从零准备校招编程面试,保姆级路线图
  • Hot 100 刷题计划】 LeetCode 146. LRU 缓存 | C++ 哈希表+双向链表
  • 流浪动物救助小程序(文档+源码)_kaic
  • 终极GModPatchTool指南:3步彻底修复Garry‘s Mod浏览器功能异常
  • Linux学习日常13
  • 2026年q2国内冷弯型钢设备主流品牌实测排行:c型钢冷弯设备,u型钢辊压成型机,光伏支架冷弯设备,优选指南! - 优质品牌商家
  • 从CU/DU分离到8种Option:手把手拆解5G基站(gNB)内部架构与接口选择
  • 不止于开发:用mkcert为你的家庭NAS、智能家居搭建安全HTTPS内网访问
  • 宿舍管理系统小程序(文档+源码)_kaic
  • 实时质检系统响应<8ms,产线API吞吐翻4.2倍,PHP 8.9异步I/O落地真相,你敢信?
  • TVA在新能源汽车制造与检测中的实践与创新(9)
  • QML自适应避坑指南:为什么我的Layout布局总出问题?
  • Day23
  • 手把手教你用Node.js + 免费天气API,5分钟给个人网站加个天气小挂件
  • python mypy