LeetCode15.三数之和

题目

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

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

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

示例

输入: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] 。
注意,输出的顺序和三元组的顺序并不重要。

思路

这是一个经典的三数之和问题,可以使用排序和双指针的方法来解决。

首先,对输入数组进行排序,然后从左到右依次枚举第一个数。对于每个第一个数,使用双指针方法,在剩余的数中查找满足和为负数的两个数。如果找到一组满足条件的数,则将它们添加到结果列表中。需要注意的是,我们要跳过重复的数以避免产生重复的三元组。

Code:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;int n = nums.size();// 边界情况处理if (n < 3)return result;// 排序数组sort(nums.begin(), nums.end());for (int i = 0; i < n - 2; ++i) {// 跳过重复元素if (i > 0 && nums[i] == nums[i - 1])continue;int j = i + 1;int k = n - 1;while (j < k) {int sum = nums[i] + nums[j] + nums[k];if (sum == 0) {result.push_back({nums[i], nums[j], nums[k]});// 跳过重复元素while (j < k && nums[j] == nums[j + 1])++j;while (j < k && nums[k] == nums[k - 1])--k;++j;--k;} else if (sum > 0) {--k;} else {++j;}}}return result;}
};
  • 首先,我们声明一个名为result的空二维向量,用于保存所有满足条件的三元组。我们还获取数组大小,并检查是否有足够的元素来形成至少一个三元组(即数组大小不小于3)。

  • 接下来,我们对输入数组进行排序,这是该算法的关键步骤。通过对数组进行排序,我们可以确保找到的三元组是不重复的。我们使用标准库的sort函数,并传入数组的起始和结束迭代器。

  • 然后,我们使用两个嵌套循环来枚举前两个数,以及查找剩余的数中是否有与它们相加等于零的数。外层循环从0到n-2枚举第一个数,其中n是数组大小。内层循环使用双指针方法,在剩余的数中查找与前两个数的和相等且不同的数对。使用双指针方法的好处是可以将时间复杂度优化到O(n)。

  • 内层循环包含一个while循环,用于移动指针j和k,以便在剩余的数中查找与前两个数的和相等且不同的数对。如果找到一组满足条件的数,则将它们添加到结果列表中,并跳过重复的数以避免产生重复的三元组。

因此,该算法的时间复杂度为O(n^2),其中n为数组中的元素数量,因为在最坏情况下需要枚举所有可能的数对。

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

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

相关文章

LeetCode646. Maximum Length of Pair Chain——动态规划

文章目录 一、题目二、题解 一、题目 You are given an array of n pairs pairs where pairs[i] [lefti, righti] and lefti < righti. A pair p2 [c, d] follows a pair p1 [a, b] if b < c. A chain of pairs can be formed in this fashion. Return the length …

粉丝2000 啦,选对赛道,做正确的事情,粉丝涨到2000说明大家对我做的事情还是非常的认可的,继续坚持中,将相关资料做了视频整理

1&#xff0c;见证历史成长&#xff0c;粉丝涨到 2000 啦 2&#xff0c;把视频进行分类&#xff0c;研究xinference相关视频 【xinference】&#xff08;1&#xff09;&#xff1a;在autodl上&#xff0c;使用xinference部署chatglm3大模型&#xff0c;支持函数调用&#xff0…

网站常见的攻击类型有什么,如何针对性防护

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着不管是什么网站类型潜在的威胁一直都存在。 在…

简单的服务器取证

一次简单的服务器取证入门 检材&#xff1a;https://pan.baidu.com/s/1T_OBlqe–7C-sfYhYyMZjQ?pwd8e19 目录 1、系统的内核版本2、系统的历史命令第32条3、SSH服务的开放端口4、宝塔面板的用户名5、宝塔面板的端口号6、面板上的网站域名7、面板是否开启了SSL服务8、面板别名是…

AD24-PCB间距规则、布线线宽规则、规则使能优先级设置

一、PCB间距规则 1、设计-规则 2、忽略焊盘间距要打勾&#xff0c;不然会出现右边的错误 3、可进行不同间距要求添加 二、布线规则 1、电源线宽&#xff0c;根据载流&#xff0c;进行加宽 非阻抗走线&#xff0c;根据生成要求 大于6mil&#xff0c;成本最低&#xff1b;…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

C++之C++输入输出流

目录 1、输入输出的含义 2、C输入输出机制 2.1、"流"的概念 2.2、C常用流类型 2.3、流类型之间的关系 2.4、流的状态 2.5、管理流的状态 2.6、流的通用操作 2.7、缓冲区 2.7.1、为什么要引入缓冲区呢&#xff1f; 2.7.2、缓冲区要做哪些工作&#xff1f; …

Stable Diffusion 模型下载:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型&#xff0c;可以生成一些 R…

Android批量加载图片OOM问题

Android批量加载图片OOM问题 前言使用内存缓存使用磁盘缓存处理配置更改 前言 将单个位图加载到界面中非常简单&#xff0c;但如果您需要同时加载较大的一组图片&#xff0c;则操作起来会比较复杂。实际上&#xff0c;在许多情况下&#xff08;比如使用 ListView、GridView 或…

JDBC连接过程

JDBC连接过程 创建一个以JDBC连接数据库的程序&#xff0c;主要包含以下6个步骤&#xff1a; 1.加载数据库驱动 2.获取数据库连接 3.创建Statement 4.执行SQL 5.处理结果 6.关流&#xff0c;释放资源 1 加载JDBC驱动 在连接数据库之前&#xff0c;首先要加载对应数据库的驱动…

useGeneratedKeys=“true” keyProperty=“id”

useGeneratedKeys“true” keyProperty“id” 这个注解在xml文件的insert方法中&#xff0c;可以用于返回主键值&#xff1b; 并且useGeneratedKeys参数只针对 insert 语句生效&#xff0c;默认为 false&#xff1b;

Java - @JSONField和@JsonProperty注解

JSONField注解是阿里巴巴的fastjson框架中的注解&#xff0c;用于指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系 JsonProperty注解是Jackson框架中的注解&#xff0c;用法类似于JSONField&#xff0c;也是指定JSON字符串中的属性名和Java对象中的属性名之间的映…

【STM32】1.8寸LCD显示实验

目录 一、硬件介绍 1. STM32F03C8T6 2. 1.8寸LCD 二、STM32CubeMX配置 1. 接口配置 ​编辑 2. 其他配置 三、LCD图片取模 1. 打开图片&#xff08;.bmp格式&#xff09; 2. 设置 3. 点击保存数组。 4. 将生成的数组复制到lcd_picture.h文件中。 四、代码测试&…

精通Nmap:网络扫描与安全的终极武器

一、引言 Nmap&#xff0c;即NetworkMapper&#xff0c;是一款开源的网络探测和安全审计工具。它能帮助您发现网络中的设备&#xff0c;并识别潜在的安全风险。在这个教程中&#xff0c;我们将一步步引导您如何有效地使用Nmap&#xff0c;让您的网络更加安全。 因为Nmap还有图…

顺序表详解(SeqList)

本文使用C语言进行顺序表的代码实现。 博主将使用代码和相关知识相结合的方式进行讲解&#xff0c;简单易懂&#xff0c;懵懂的大学生一听就会~ 顺序表是一种线性表的存储结构&#xff0c;它将数据元素存储在一段连续的存储空间中&#xff0c;每个元素占据一个存储单元&#x…

怎样使用Pyglet库给推箱子游戏画关卡地图

目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 pyglet库 是一个跨平台的Python多媒体库&#xff0c;提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染…

NestJS入门9:管道入门

前文参考 NestJS入门1&#xff1a;创建项目 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 NestJS入门4&#xff1a;MySQL typeorm 增删改查 NestJS入门5&#xff1a;加入Swagger NestJS入门6&#xff1a;日志中间件 NestJS入门7&…

Unity数据持久化之PlayerPrefs

这里写目录标题 PlayerPrefs概述基本方法PlayerPrefs存储位置实践小项目反射知识补充数据管理类的创建反射存储数据----常用成员反射存储数据----List成员反射存储数据----Dictionary成员反射存储数据----自定义类成员反射读取数据----常用成员反射读取数据----List成员反射读取…

【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

欢迎大家来到c语言知识小课堂&#xff0c;今天的知识点是操作符和进制 目录 一、进制之间的转化1、什么是二进制&#xff0c;八进制&#xff0c;十进制&#xff0c;十六进制2、进制之间的转化其他进制转化为十进制十进制转化为二进制二进制转化为八进制八进制转化为二进制二进…

力扣55. 跳跃游戏(动态规划)

Problem: 55. 跳跃游戏 文章目录 题目描述思路复杂度Code 题目描述 思路 我们将问题稍做转换每次求取当前位置可以走到的最远位置&#xff0c;在此基础上我们将最终判断是否能走出整个nums&#xff1b;同时我们要判断中途会不会遇到某个位置是0使得不能继续走下去 复杂度 时间…