LeetCode 15.三数之和

三数之和

问题描述

LeetCode 15.三数之和
给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。

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

解决思路

这个问题可以通过先将数组排序,然后使用双指针来解决。具体解决步骤如下:

  1. 首先对数组 nums 进行排序,以便后续双指针的操作。

  2. 初始化一个空列表 res 用于存储符合条件的三元组。

  3. 使用外层循环遍历数组 nums,将当前元素设为 nums[first]

  4. 在内层循环中,使用双指针 secondthird 来寻找满足条件的三元组。secondfirst 的下一个位置开始,third 从数组的最后一个位置开始。

  5. 在内层循环中,首先判断是否需要跳过重复的元素,即如果 second > first + 1 并且 nums[second] == nums[second-1],则跳过当前元素。

  6. 在内层循环中,使用 target 变量表示目标值,即 target = -nums[first]

  7. 使用 while 循环来不断调整 secondthird 指针,使它们向中间靠拢,直到找到一个满足条件的三元组或者 second == third 时结束。

  8. 如果找到一个满足条件的三元组,将其添加到结果列表 res 中。

  9. 继续外层循环,重复上述步骤,直到遍历完整个数组。

  10. 返回结果列表 res

代码实现

以下是使用Python编写的代码,实现了上述解决思路,并添加了注释以解释每个步骤:

class Solution:def threeSum(self, nums):n = len(nums)nums.sort()  # 对数组进行排序res = []  # 存储结果的列表for first in range(n):if first > 0 and nums[first] == nums[first - 1]:  # 跳过重复的元素continuethird = n - 1  # 初始化第三个指针target = -nums[first]  # 计算目标值for second in range(first + 1, n):if second > first + 1 and nums[second] == nums[second - 1]:  # 跳过重复的元素continuewhile second < third and nums[second] + nums[third] > target:  # 调整第二个和第三个指针third -= 1if second == third:breakif nums[second] + nums[third] == target:  # 找到满足条件的三元组res.append([nums[first], nums[second], nums[third]])return res  # 返回结果列表

复杂度分析

  • 时间复杂度: O(N^2),其中N是数组nums的长度。

  • 空间复杂度: O(log N)。我们忽略了存储答案的空间,额外的排序操作空间复杂度为O(log N)。但需要注意的是,由于我们修改了输入数组nums,在实际情况下可能不允许这种操作。因此,也可以将其看作是使用了一个额外的数组来存储nums的副本并进行排序,这样空间复杂度为O(N)。

结论

三数之和问题是一个经典的双指针问题,通过使用双指针方法,我们可以高效地找到满足条件的三元组。这个算法的时间复杂度和空间复杂度都在合理范围内,适用于大多数情况。希望这篇博客能够帮助你更好地理解和解决这个问题。

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

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

相关文章

Spring的注解开发-Spring配置类的开发

Bean配置类的注解开发 Component等注解替代了<bean>标签&#xff0c;但像<import>、<context:componentScan>等非<bean>标签怎样去使用注解去替代呢&#xff1f;定义一个配置类替代原有的xml配置文件&#xff0c;<bean>标签以外的标签&#xff…

如何利用niceGUI构建一个流式单轮对话界面

官方文档 参考文档 import asyncio import time import requests from fastapi import FastAPI from nicegui import app, uiclass ChatPage:temperature: ui.slider Nonetop_p: ui.slider Noneapi_key: ui.input Nonemodel_name: ui.input Noneprompt: ui.textarea None…

文心一言 VS 讯飞星火 VS chatgpt (103)-- 算法导论10.1 1题

一、用go语言&#xff0c;仿照图 10-1&#xff0c;画图表示依次执行操作 PUSH(S&#xff0c;4)、PUSH(S&#xff0c;1)、PUSH(S&#xff0c;3)、POP(S)、PUSH(S&#xff0c;8)和 POP(S)每一步的结果&#xff0c;栈 S初始为空&#xff0c;存储于数组 S[1…6]中。 文心一言&…

EM@极坐标系@曲线的极坐标方程

文章目录 abstract平面上的极坐标极坐标极坐标中位置和点的对应关系极坐标的常用限定极坐标描述对称点极坐标变换为直角坐标 坐标系间同位置坐标的变换极坐标上建立同原点直角坐标直角坐标系上建立常用极坐标系极坐标与直角坐标的关系极坐标和坐标系平移&#x1f47a;例 曲线的…

第5章-宏观业务分析方法-5.3-主成分分析法

5.3.1 主成分分析简介 主成分分析是以最少的信息丢失为前提,将原有变量通过线性组合的方式综合成少数几个新变量;用新变量代替原有变量参与数据建模,这样可以大大减少分析过程中的计算工作量;主成分对新变量的选取不是对原有变量的简单取舍,而是原有变量重组后的结果,因此…

【C++/2023年10月1日】

【黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难】 https://www.bilibili.com/video/BV1et411b73Z/?p47&share_sourcecopy_web&vd_source1cc941c8f5681d0ce0140c7d0f5bf5d3 默认情况下输出一个小数&#xff0c;会显示6位有效数字 float4字节/double8字节/i…

【网络协议】IP

当连接多个异构的局域网形成强烈需求时&#xff0c;用户不满足于仅在一个局域网内进行通信&#xff0c;他们希望通过更高一层协议最终实现异构网络之间的连接。既然需要通过更高一层的协议将多个局域网进行互联&#xff0c;那么这个协议就必须为不同的局域网环境定义统一的寻址…

jmh的OperationsPerInvocation参数

背景 最近再看fllink的性能基准测试时&#xff0c;发现它使用了OperationsPerInvocation注解&#xff0c;本文就来记录下这个注解的含义 官方解释 从官方文档&#xff1a;http://javadox.com/org.openjdk.jmh/jmh-core/0.9/org/openjdk/jmh/annotations/OperationsPerInvoca…

opencv 常用的滤波器及应用技巧

常用滤波器&#xff1a; 标准滤波器&#xff08;邻域平均法&#xff09;&#xff1a;该滤波器是所有滤波器里最简单的一种&#xff0c;输出的像素值由输入的滤波核所覆盖的像素值均值决定&#xff08;每个邻域像素对其贡献的权重是相同的&#xff09;。高斯滤波&#xff1a;该…

七、2023.10.1.Linux(一).7

文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改&#xff1f;3、说说常用的Linux命令&#xff1f;4、说说如何以root权限运行某个程序&#xff1f;5、 说说软链接和硬链接的区别&#xff1f;6、说说静态库和动态…

nginx隐藏版本号和标识

1.隐藏版本号:nginx-服务器banner泄漏风险_banner信息泄露_javachen__的博客-CSDN博客 2.隐藏nginx标识 cd /usr/local/nginx-1.24.0/src/corevi nginx.h在第14行 cd /usr/local/nginx-1.24.0/src/httpvi ngx_http_special_response.c在第22,29,36行 cd /usr/local/nginx-1.2…

JavaScript解构赋值介绍

JavaScript解构赋值介绍 JavaScript解构赋值是一种简化变量赋值的语法&#xff0c;允许从数组或对象中提取数据并将其赋值给变量。【https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment】 1.数组解构赋值 let numbers…

【知识梳理】多级页表的原理分析【地址形成过程】【扩充思考】

多级页表的地址形成过程 首先每个进程中都至少有一个页表&#xff08;段页式可以有多个页表&#xff09;&#xff0c;都有一个页表基地址寄存器&#xff08;PTBR&#xff09;&#xff0c;以下针对三级页表进行分析。 level1&#xff1a;PTBR代表的是一级页表的基地址&#xf…

leetCode 376.摆动序列 贪心算法

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

【C语言数据结构】队列-顺序存储(顺序队列)

队列-顺序存储 代码实现 代码实现 #include<stdio.h> #include<stdlib.h> #include<stdbool.h>#define MaxSize 100 #define ElemType inttypedef struct{//定义队列数据元素ElemType data[MaxSize];//定义队头和队尾指针&#xff08;说是指针&#xff0c;其…

中位数C++题解

T3 中位数 题目描述&#xff1a; 在玩正整数。他手里有一个串&#xff0c;每次会实施三种操作中的一种。 把没有加入的最小的正整数&#xff0c;从左边加入串中。把没有加入的最小的正整数&#xff0c;从右边加入串中。询问此时串的最中间的数&#xff0c;也就是假设当前有 个…

labview 混合信号图 多曲线分组

如果你遇到了混合信号图 多曲线分组显示的问题&#xff0c;本文能给你帮助。 在文章的最好&#xff0c;列出了参考程序下载链接。 一个混合信号图中可包含多个绘图区域。 但一个绘图区域仅能显示数字曲线或者模拟曲线之一&#xff0c;无法兼有二者。 以下显示的分两组&#…

ARM汇编基础指令整合

汇编语言的组成 伪操作 不参与程序的执行&#xff0c;但是用于告诉编译器程序该怎么编译 如&#xff1a; .text .global .end .if .else .endif .data 汇编指令 汇编器将一条汇编指令编译成一条机器码&#xff0c;在内存里一条指令…

RSA算法

算法简介 RSA是一种非对称加密方式。发送者把明文通过公钥加密后发送出去&#xff0c;接受者把密文通过私钥解密得到明文。 算法过程 生成公钥和私钥 选取两个质数p和q&#xff0c;np*q。n的长度就是密钥长度。φ(n)(p-1)*(q-1)φ(n)为n的欧拉函数。找到1-φ(n)间与φ(n)互质的…

DTO的作用

DTO只是一个代码规范的设计&#xff0c;无需过度执着于DTO。在小型项目中&#xff0c;很多情况没有必要使用DTO返回数据&#xff0c;直接用map也完全可以。 减少多余的参数&#xff0c;出于安全性、节约流量的考虑。 例如&#xff1a;密码&#xff0c;出于安全性考虑不返回前端…