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

LeetCode热题 15.三数之和(双指针)

题目

思路:

最简单的最暴力的想法就是三重循环便利所有可能的三元组,检查他们的和是否为零,并去除重复的组合。这种的时间复杂度是0(n^3)。
这时候我们可以想到 对于 a + b + c = 0求不重复的三元组,等价于 固定一个 a,求 b + c = -a 的不重复的 二元组。
我们可以排一下序,固定a,从0开始往右走,然后对于每个a,b和c双指针,分别从 a + 1 往右和 n - 1 往左走,每次判断一下:

  • 如果满足 b + c = -a 就记录一下,然后两个指针分别往右 往左移动一下,这里注意的是去重。 在移动一下之前,要判断是否下一个和当前相等,往前一直走。
  • 如果 b + c < -a,那我们就把小的 b (因为是递增的)往右挪一下
  • 如果 b + c > -a,那我们就把大的 c往左挪一下。
    具体代码:
 vector<vector<int>> ans; //  结果int len = nums.size();  // 长度if (len < 3) return ans;  // 优化  如果就没有3个,直接返回空  无解sort(nums.begin(), nums.end());  //  排序for (int i = 0; i < len - 2; i ++ ){  // 固定三元组最小那一个 num[i] 也就是 aif (nums[i] > 0) break;  // 最小的都大于 0 了,那不可能合为0了,直接无解if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的 aint left = i + 1, right = len - 1;  // 双指针int temp = -nums[i];  //  需要找的两数和while (left < right){int sum = nums[left] + nums[right];if (sum == temp){  //  找到解ans.push_back({nums[i], nums[left], nums[right]});//  跳过重复的 left  和 rightwhile(left < right && nums[left] == nums[left + 1]) left ++;while(left < right && nums[right] == nums[right - 1]) right --;//  这里不要忘记移动一下,前面循环结束nums[left]还是上面记录过的解的那个值,需要再移动一下  到下一个不同的值left ++;right --;  } else if (sum < temp) left ++;  //  和小了,让左指针右移else right --;  //  和大了,让右指针左移}}return ans;

文章转载自:

http://rK4DEV9v.cjnfb.cn
http://BzW6P2Ve.cjnfb.cn
http://XnBWApKq.cjnfb.cn
http://aCnuvjJy.cjnfb.cn
http://xvzupXaV.cjnfb.cn
http://9XJbNGwx.cjnfb.cn
http://K4n36fkC.cjnfb.cn
http://jzyTQy6r.cjnfb.cn
http://qTn4R6Re.cjnfb.cn
http://NnBxhpVV.cjnfb.cn
http://jvZUsFnn.cjnfb.cn
http://3HPMx5wB.cjnfb.cn
http://3CWPRyZH.cjnfb.cn
http://PmAH2A9n.cjnfb.cn
http://F2Q7obAF.cjnfb.cn
http://59FZWHv2.cjnfb.cn
http://wDGP5YSy.cjnfb.cn
http://eigJNLy7.cjnfb.cn
http://Jfmndn2g.cjnfb.cn
http://wza4byel.cjnfb.cn
http://SpkS6T60.cjnfb.cn
http://SaJWprSV.cjnfb.cn
http://nRJDZvgd.cjnfb.cn
http://3CPDNQ0k.cjnfb.cn
http://8ISGMLqg.cjnfb.cn
http://xebbF8GX.cjnfb.cn
http://M3dNPHrr.cjnfb.cn
http://PyHbL4Q9.cjnfb.cn
http://HO3jXwNq.cjnfb.cn
http://cL4peGES.cjnfb.cn
http://www.dtcms.com/a/374348.html

相关文章:

  • 我对 OTA 的理解随记,附GD32/STM32例程
  • 快速构建数据集-假数据(生成划分)
  • c++ 杂记
  • Effective Modern C++ 条款26:避免在通用引用上重载
  • Android14 init.rc中on boot阶段操作4
  • PYQT5界面类继承以及软件功能开发小记
  • 【机器学习】吴恩达机器学习笔记
  • UE5 性能优化(1) 模型合并,材质合并
  • Selenium4+Pytest自动化测试框架实战
  • 基于RK3568多网多串(6网+6串+2光)1U/2U机架式服务器在储能与电力的应用
  • 【Python】运动路线记录GPX文件的操作API函数,以及相关GUI界面(支持复制、拼接、数据生成、修改,SRT字幕生成等功能)
  • 西嘎嘎学习 - C++vector容器 - Day 7
  • 第三章:Python基本语法规则详解(二)
  • Next系统总结学习(一)
  • 备考系统分析师-专栏介绍和目录
  • 【rk3229/rk3228a android7.1 LPDDR EMMC EMCP 批量sdk】
  • Kali 自带工具 dirb:Web 路径扫描与 edusrc 挖掘利器
  • 【系统分析师】第2章-基础知识:数学与工程基础(核心总结)
  • 房屋安全鉴定机构评价
  • JAVA:io字符流FileReader和FileWriter基础
  • 从零深入理解嵌入式OTA升级:Bootloader、IAP与升级流程全解析
  • 7.0 热电偶的工作原理
  • GPT(Generative Pre-trained Transformer)模型架构与损失函数介绍
  • 【51单片机】【protues仿真】基于51单片机公交报站系统
  • linux常用命令(2)——系统管理
  • Yarn介绍与HA搭建
  • 记个笔记:Cocos打包安卓使用安卓通信模块
  • 基于Python的云原生TodoList Demo 项目,验证云原生核心特性
  • 2025年- H121-Lc28. 找出字符串中第一个匹配项的下标(数组)--Java版
  • 【底层机制】auto 关键字的底层实现机制