15. 三数之和 - 力扣

1. 题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

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

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

2. 示例

3. 分析

暴力枚举是肯定不行的,枚举 i、j、k 的情况,时间复杂度为 O(N^3),在这道题目中是会超时的。


我们可以联想到昨天一个题目:LCR 179. 查找总价格为目标值的两个商品 - 力扣,该题是利用单调性+双指针找出target的,那我们是不是可以升维到固定一个数,去找与固定数相反的两数之和。

解题方法:

  1. 为了快速寻找两数之和,首先对数组进行排序
  2. 固定一个数 x
  3. 在该数后面的区间使用双指针算法寻找两数之和为 -nums[x] 即可

这道题中等就中等在 去重操作,当固定一个数后,有两个需去重的情况:

  • 两个指针的去重。 当左指针后一个元素与当前左指针元素相等时,直接跳过该重复元素即可;同理,右指针也一样。因为相等元素的情况已经枚举过了,就不必再枚举了。
  • 固定数的去重。 当第一个固定数的情况已枚举完毕,如果下一个固定数与前一个固定数相等时,也是直接跳过该重复元素即可。因为相等元素的情况已经枚举过了,就不必再枚举了。

举例: 

红框框内的就是重复元素的过程,不管是左右指针还是固定数,我们只需第一次的情况即可。

还需注意越界问题:
如:[0, 0, 0, 0] 这种组合,跳过重复元素的同时,左右指针需注意不能越过对方,另外固定数也是不能越过数组长度。

细节优化:排序后为升序,我们只需枚举 小于等于0 的固定数的情况即可,因为如果固定数为正数,后面的数都为正数,三个正数相加是 组合不到和为0 的情况。


class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;int n = nums.size();// 1. 排序sort(nums.begin(), nums.end());// 2. 固定一个数int x = 0;// 3. 使用双指针算法在nums[x]后的区间寻找两数之和等于 -nums[x]while(x < n && nums[x] <= 0){int left = x + 1, right = n-1, target = -nums[x];while(left < right){int sum = nums[left] + nums[right];if(sum > target) right--;else if(sum < target) left++;else if(sum == target){       ret.push_back({nums[x], nums[left], nums[right]});left++, right--;// 插入一个三元组后指针继续移动寻找符合要求的两数之和      // 去重 left 和  rightwhile(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;}}x++;// 对固定数去重while(x < n && nums[x] <= 0 && nums[x] == nums[x-1]) x++;} return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526286.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-pytorch1(持续更新)

上一节我们学习了机器学习的线性模型和非线性模型的机器学习基础知识&#xff0c;这一节主要将公式变为代码。 代码编写网站&#xff1a;https://colab.research.google.com/drive 学习课程链接&#xff1a;ML 2022 Spring 1、Load Data&#xff08;读取数据&#xff09; 这…

代码随想录(day2)——数组

Leetcode.977 有序数组的平方&#xff1a; 题目如下&#xff1a; 对于本题&#xff0c;可以采用双指针的方法进行解答&#xff0c;如果笔者写的几篇关于题解的文章有幸被读者浏览的话&#xff0c;会发现&#xff0c;针对数组问题&#xff0c;很大一部分是使用双指针来解决的。…

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能&#xff0c;可为开发者提供如公园长椅、货摊等交互对象的统一外观封装&#xff0c;如UE的CitySample&#xff08;黑客帝国Demo&#xff09;中就运用到了SmartObject。 但SmartObject实践起来较为繁琐&#xff0c;主要依赖于AI及行为树…

UE 中的数学

坐标空间转换 使用引擎提供的函数 通过 Rotate Vector / Unrotate Vector 转换坐标空间&#xff0c;因为该方法内部是通过旋转矩阵对向量进行变换 旋转计算 角度计算

【leetcode热题】 二叉树的后序遍历

给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调&#xff08;Oligopolistic Price Coordination&#xff09;或有意识的平行行为&#xff08;Conscious Parallelism&#xff09; 1.1.1. 在条件允许的情况下&#xff0c;它会发生在市场集中度较高的行业当中 1.1.…

蓝桥杯递推与递归法|斐波那契数列|数字三角形|42点问题|数的计算|数的划分(C++)

递归是用来做dfs&#xff0c;是搜索算法的基础 递推是用来做dp部分&#xff0c;及部分其他算法&#xff0c;复杂度较低&#xff0c;不会出现爆栈问题递推法&#xff1a; 递推法是一种在数学和其他领域广泛应用的重要方法&#xff0c;它在计算机科学中被用作一种关键的数值求解…

构建高效可靠的消息队列系统:设计与实现

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 一、引言 二、设计目标 2.1、高可用性 1. 集群搭建 1.1 …

二 超级数据查看器   讲解稿   导入功能

二 超级数据查看器 讲解稿 导入功能 APP下载地址 百度手机助手 下载地址4 ​ 讲解稿全文&#xff1a; 大家好。 今天我们对 超级数据查看器的 导入信息功能 做一下详细讲解。 首先&#xff0c;我们打开 超级数据查看器。 我们这个系统要实现的是&#xff0c;快速生…

qt 日志 格式化打印 QMessagePattern

进入 qt源码 调试:qt creator debug 无法进入 qt源码 调试-CSDN博客 qt为 格式化打印 日志 提供了一个简易的 pattern(模式/格式) 词法解析类QMessagePattern,该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qlogging.cpp 中 该类直接在构造函数中…

C++笔记之嵌套类中的成员函数识别外层类的成员变量

C++笔记之嵌套类中的成员函数识别外层类的成员变量 —— 杭州 2024-03-10 code review! 文章目录 C++笔记之嵌套类中的成员函数识别外层类的成员变量1.嵌套类声明完之后跟一个标识符是什么含义?2.嵌套类中的成员函数如何识别外层类的成员变量?1.嵌套类声明完之后跟一个标识…

在Blender中清理由Instant-NGP等几何学习技术生成的网格

使用布尔运算: 创建一个大的立方体或其他简单几何体包裹住全部网格。使用布尔修改器对两个网格进行“差集”运算。这将移除超出包裹体之外的多余网格部分。 手动选择并删除: 进入编辑模式&#xff08;按Tab键&#xff09;。按A键取消选择所有顶点。按B键并拖动以选择您想要删除…