双指针算法(1)

本节学习寻找数组中三数之和为指定值所有集合的问题.该问题是采用左右双指针算法解决的典型问题之一,一三数之和为限制条件,适当调整左右指针.

问题描述:

给定一个包含n个整数的数组array,判断该数组是否存在三个元素x,y,z,是x+y+z等于0.

找出所有符合条件且不重复的三元组.

双指针算法思路解析:

仔细审阅题目,其实求x,y,z三数之和是否为0,可以视为求x和y两数之和是否等于-z.因此可以将数组先进行排序以避免不必要的遍历,降低复杂度;然后遍历整个数组一遍,可以将每个遍历到的元素视为-z在遍历过程中使用左右指针来分别指向当前元素的下一个元素及数组的最后一个元素.变量如下:

k变量:表示数组中的当前元素的位置

l变量:表示当前元素的下一个元素,其初始值为k+1

r变量:表示3个数中的第三个数字,其初始值为数组长度减一

res变量:表示最终返回的结果,包含所有和为0的不重复三元组

s变量:表示三数之和

代码如下:

array.sort()
res = []
for k in range(len(array) - 1)l,r = k+1,len(arry)-1

只要左指针小于右指针,就继续通过不断计算三数之和决定左右指针是否应该移动,并且在移动过程中不断跳过重复元素.判断过程分为三种,当三数之和为0时,需要再判断res数组中是否已存在此三元数组,如果不存在,则添加到res中;让后继续让左指针向右移动,右指针向左移动,在移动过程中再使用一个循环不断跳过重复元素,以提高代码效率

当三数之和小于0时,说明其中的元素需要增大.由于数组已经是排序后的,因此让左指针向右移动可以使三数之和增大,当三数之和大于0时同理

整体代码如下:

def threeSum(self, arry):# 对数组进行排序arry.sort()# 初始化结果列表res = []# 遍历数组,k代表当前考虑的第一个数for k in range(len(arry)-2):# 如果当前数大于0,则后面的数之和一定大于0,可以提前结束循环if arry[k] > 0: break# 跳过重复的元素,避免找到重复的三元组if k > 0 and arry[k] == arry[k-1]: continue# 初始化左右指针l, r = k+1, len(arry)-1# 使用双指针查找和为0的三元组while l < r:s = arry[k] + arry[l] + arry[r]# 如果三数之和小于0,移动左指针if s < 0:l += 1# 跳过重复的元素while l < r and arry[l] == arry[l-1]: l += 1# 如果三数之和大于0,移动右指针elif s > 0:r -= 1# 跳过重复的元素while l < r and arry[r] == arry[r-1]: r -= 1# 如果三数之和等于0,找到了一个解else:# 将三元组添加到结果列表中res.append((arry[k], arry[l], arry[r]))# 移动左右指针,寻找下一个解l += 1r -= 1# 跳过重复的元素while l < r and arry[l] == arry[l-1]: l += 1while l < r and arry[r] == arry[r+1]: r -= 1# 返回所有找到的三元组return res

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

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

相关文章

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

机器学习与图像处理中上采样与下采样

一、机器学习中的上采样 目的&#xff1a;在机器学习中&#xff0c;上采样用于处理不平衡数据集&#xff0c;即某些类别的样本数量远多于其他类别。上采样的目标是通过增加少数类样本的数量来平衡类别分布&#xff0c;从而提高模型对少数类的识别能力。 1.随机过采样&#xff0…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

认识RabbitMq和RabbitMq的使用

1 认识RabbitMq RabbitMQ是⼀个消息中间件&#xff0c;也是⼀个生产者消费者模型&#xff0c;它负责接收&#xff0c;存储并转发消息。 2.1 Producer和Consumer Producer&#xff1a;生产者&#xff0c;是RabbitMQServer的客户端&#xff0c;向RabbitMQ发送消息 Consumer&…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…

Excel把其中一张工作表导出成一个新的文件

excel导出一张工作表 一个Excel表里有多个工作表&#xff0c;怎么才能导出一个工作表&#xff0c;让其生成新的Excel文件呢&#xff1f; 第一步&#xff1a;首先打开Excel表格&#xff0c;然后选择要导出的工作表的名字&#xff0c;比如“Sheet1”&#xff0c;把鼠标放到“She…

Redis-09 SpringBoot集成Redis

Jedis 和 lettuce 基本已经过时 集成RedisTemplate 单机 1.建 Modul 2.改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

git 命令之只提交文件的部分更改

git 命令之只提交文件的部分更改 有时&#xff0c;我们在一个文件中进行了多个更改&#xff0c;但只想提交其中的一部分更改。这时可以使用 使用 git add -p 命令 Git add -p命令允许我们选择并添加文件中的特定更改。它将会显示一个交互式界面&#xff0c;显示出文件中的每个更…

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块&#xff0c;只需要在文件中通过require(http)引入即可。…

bridge-multicast-igmpsnooping

# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…

麒麟部署一套NFS服务器,用于创建网络文件系统

一、服务端共享目录 在本例中,kyserver01(172.16.200.10)作为客户端,创建一个目录/testdir并挂载共享目录;kyserver02(172.16.200.11)作为服务端,创建一个共享目录/test,设置为读写权限,要求客户端使用root登录时映射为nobody用户、非root登录时保持不变。 服务端启…

《线性代数的本质》

之前收藏的一门课&#xff0c;刚好期末复习&#xff0c;顺便看一看哈哈 课程链接&#xff1a;【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量&#xff0c;需要先明白什么是向量 不同专业对向量的看法 物理专…

Scala—Collections集合概述

Scala Scala-集合概述 ScalaScala集合概述1 不可变集合&#xff08;Immutable Collections&#xff09;2 可变集合&#xff08;Mutable Collections&#xff09;3 Scala 集合类的层次结构 Scala集合概述 在 Scala 中&#xff0c;集合主要分为两大类&#xff1a;可变集合&#…

LLC与反激电路设计【学习笔记】

LLC电路&#xff1a; LLC电路是由2个电感和1个电容构成的谐振电路&#xff0c;故称之为LLC&#xff1a; LLC电路通过谐振能够实现MOS管的软开(soft switching)&#xff0c;减少开关损耗。另外MOS管的通态损耗也很低&#xff0c;换言之产生的焦耳热也少&#xff0c;这样就可以不…

java基础概念36:正则表达式1

一、正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则&#xff1b;作用二&#xff1a;在一段文本中查找满足要求的内容。——爬虫 二、正则表达式 2-1、字符类 示例&#xff1a; public static void main(String[] args) {System.out.println("a".matc…

误删了照片,甚至对存储卡进行了格式化 都可以找到丢失的图片,并让您恢复它们 支持一键恢复或永久删除丢失的照片、视频、音乐、文档等-供大家学习研究参考

误删了照片&#xff0c;甚至对存储卡进行了格式化 都可以找到丢失的图片&#xff0c;并让您恢复它们 支持一键恢复或永久删除丢失的照片、视频、音乐、文档等。 建议及早恢复&#xff0c;覆盖就不能找回了~ 下载&#xff1a; https://download.csdn.net/download/weixin_43097…

candence: 常用的一些命令: Move / Mirror / Rotate / Spain / Fix / unFix / Flipdesign

常用的一些命令 一、 Move 移动 一个可移动一个&#xff0c;也可多个 移动器件 二、 Mirror 镜像 Mirror 就是top 和 bottom 层的器件进行相互转换 三、 Rotate 旋转 移动过程中旋转 四、旋转 Spain 不能在移动中旋转 可以一次旋转一个&#xff0c;也可多个 一次旋转…

(三)手势识别——动作识别应用【代码+数据集+python环境(免安装)+GUI系统】

&#xff08;三&#xff09;手势识别——动作识别应用【代码数据集python环境&#xff08;免安装&#xff09;GUI系统】 &#xff08;三&#xff09;手势识别——动作识别【代码数据集python环境GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展&#xff0c;手…

滑动窗口篇——如行云流水般的高效解法与智能之道(2)

前言&#xff1a; 上篇我们介绍了滑动窗口的含义并结合基础题型加以练习&#xff0c;本篇将以进阶难度的题目为索引&#xff0c;深化对于滑动窗口的运用与理解。 一. 将x减到0的最小操作数 题目链接&#xff1a;1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&am…