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

LeetcodeHot100(6)三数之和

一、题目分析:

给定一个整数数组nums,需要找到所有不重复的三元组(a, b, c),满足:

  1. a + b + c = 0
  2. 三元组中三个元素的下标互不相同;
  3. 结果中不能包含重复的三元组(例如[-1,0,1][0,-1,1]视为同一个三元组,只保留一份)

二.核心思路:排序法+双指针法

不能使用暴力枚举法,时间复杂度为o(n3次方)太复杂。

先对数组进行一个从小到大的排序;相同的数字挨着,方便重复使用。

然后固定一个数a,然后a的下一个定义为左指针second 来找b,最后一个元素定义为右指针third 来找c。目标找到 b+c = -a;

然后固定第一个数为a,计算 b+c是否等于-a。如果b+c>-a,则结果偏大,把右指针左移来减小数。如果b+c<-a,结果偏小,把左指针右移来增大数。

直到b+c = -a时候,把a和b、c提出来,然后跳过和b、c重复的元素 继续寻找。

直到左右指针重合了,那么就让a移到下一个。继续找。遇到重复的a也跳过。

直到某个a开始大于0了,就不找了,因为以后肯定都大于0了。

class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { int n = nums.size(); sort(nums.begin(),nums.end());//排序从小到大 vector<vector<int>> ans; //容器ans 存放一个整数容器 //枚举a for(int first = 0; first < n; ++first){ //如果a是相同的得跳过,所以必须和上一次枚举的不同 if(first > 0 && nums[first] == nums[first - 1]){ continue;//如果a和上一次的a一样,就跳过此次循环 } //c对应最右 int third = n-1; int target = -nums[first]; //枚举b for(int second = first +1;second < n ;++second){//second是a的下一个数 if(second>first+1 && nums[second] == nums[second-1]){ continue;//如果b和上一次的b一样 也跳过 } //保证b在c的左侧 while(second < third && nums[second] + nums[third]>target){ --third; //如果三者的和大于零 就左移右指针 减小数值 } //如果指针重合 跳出循环 if(second == third){ break; } //满足的记录下来 if(nums[second]+nums[third] == target){ ans.push_back({nums[first],nums[second],nums[third]}); } } } return ans; } };
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { //左右指针法 a+b+c = 0; sort(nums.begin(),nums.end()); int n = nums.size(); vector<vector<int>> ans; for(int left = 0;left<n;left++){ //判断一下和上一个相等吗 if(left>0&&nums[left-1]==nums[left]) continue; int target = -nums[left]; int b = left +1; int c = n-1; //b c的初始位置 while(b<c){ if(b > left+1 && nums[b] == nums[b-1]) { b++; continue; } if(c < n-1 && nums[c] == nums[c+1]) { c--; continue; } if(nums[b]+nums[c] < target){ b++; } else if(nums[b]+nums[c]>target){ c--; } else { //满足条件 存起来 ans.push_back({nums[left],nums[b],nums[c]}); // b去重:跳过所有和当前b相等的数 //while(b < c && nums[b] == nums[b+1]) b++; // c去重:跳过所有和当前c相等的数 // while(b < c && nums[c] == nums[c-1]) c--; //收缩 b++; c--; } } } return ans; } };
http://www.jsqmd.com/news/1068124/

相关文章:

  • 如何用SiYuan构建你的第二大脑:5个步骤实现高效知识管理
  • htmlwidgets性能优化架构指南:5种R-JavaScript通信优化方案与实施策略
  • CVE-2025-0282:Ivanti缓冲区溢出漏洞复现
  • 链表知识点以及习题
  • 3步高效配置AI数据科学团队:从零搭建智能分析环境实战指南
  • 零代码CRM,2026年中小企业值得尝试的客户管理方案
  • Hunyuan3D-2终极指南:快速生成高分辨率3D资产
  • 如何3步完成AI声音克隆:免费开源工具终极指南
  • 第14期 不限速驱动更新工具阿香婆 Ashampoo Driver Updater
  • 【Prometheus Operator 的钉钉/企业微信告警配置】
  • 误删照片还能救?实测有效的 5 个手机照片恢复方法
  • VoAPI:如何构建下一代高性能AI大模型API网关管理系统
  • 激光雷达互扰抗干扰全解|底层串扰机理、软硬协同防护、集群场景落地、故障排查、ROS全套工程代码、多工况适配全覆盖
  • 第十篇:健康菜谱助手项目复盘:完成路径、技术沉淀与后续扩展
  • 组建你的 AI 开发团队:Claude 澄清需求 + Gemini 设计原型 + Codex 并行编码
  • 从协议转换到运行时部署,SAP PI 中 Channel 定义的完整实战理解
  • 项目实训小组博客(十):局内交互流程开发(三)
  • AI 串联软件测试流水线
  • 一个做过 Office 产品的人告诉你:为什么看到“纯前端高保真”我第一反应是怀疑
  • SageAttention完全指南:如何实现2-5倍注意力加速的终极实战教程
  • AI剧本杀局内玩法规范与设计
  • 网络安全等级保护(等保2.0)全面解析:从“被罚款“到“过测评“,这篇8000字把等保讲透了!(PPT)
  • 2025_NIPS_Learning from Visual Observation via Offline Pretrained State-to-Go Transformer
  • 协作机器人选型的 6 个技术维度:重复定位精度、轴数、负载与防爆一文讲透
  • 电机驱动开发学习9. PID位置式算法实现与串口修改目标值
  • 向量数据库选型指南:FAISS、Milvus、Weaviate与Chroma的功能解析
  • 前端手记(一):项目启动与前端任务拆分
  • 08 - 组织生命体:AI时代组织管理深度诊断试卷
  • Apache DolphinScheduler技术深度解析:现代数据编排平台的高可用分布式架构设计
  • 从合规视角看开发资产凭证管理:一个被忽略的控制点