力扣视频笔记16——双指针算法+141+881

本文详细介绍了双指针算法的三种类型:普通双指针、对撞双指针和快慢指针,并通过具体例子解释它们在解决有序数组和链表问题中的应用。在有序数组中,双指针用于寻找特定和,如题目141,时间复杂度为O(N)。而在判断链表环形结构的问题中,如题目881,快慢指针能有效判断链表是否存在环,时间复杂度也为O(N)。
摘要由CSDN通过智能技术生成

定义

普通
对撞:一个在头,一个在尾,对撞着移动。
快慢
在这里插入图片描述

例子

有序数组(排列好的数组)
在这里插入图片描述
1.普通双指针
一个前指针,一个后指针,i指针从1开始,j指针依次往后遍历,当遍历到数组最后还是没有相加为12时,i指针往后移动到4,j指针从5开始遍历。。。。。

每一个i的循环里面,j最多移动N次(N为数组a里面的个数),
i最多也要移动N次(从头到尾)

时间复杂度:N的平方

2.对撞双指针:

在这里插入图片描述
在这里插入图片描述
首先两个指针一个在头,一个在尾。因为是有序排列,所以i对应着最小值,j对应着最大值。
1+9=10<12,说明相加小了,把i往后移动让其之和增大。j不变,因为j此时对应着就是最大值。
此时i——4,j——9,
4+9=13>12,说明大了,把j往前移动使其之和变小。i不动
i——4,j——7,
4+7=11<12,说明小了,把i后移动,j不动
i——5,j——7
5+7=12满足条件。
此时i和j总共遍历数组全部元素N
时间复杂度:N

3.快慢指针:

判断链表是否是环形链表。
在这里插入图片描述

慢指针移动一步,快指针移动两步
当为环形指针时,某次快慢指针会重合,因为是环形的。
在这里插入图片描述
在4那个点快慢指针重合了。

题目141

在这里插入图片描述

思路

方法一:哈希表

最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。

在这里插入图片描述
方法二:
双指针算法。这题已经变成了经典的双指针算法题了。
我们先讲一下思路,我们可以让快指针每次走两步,慢指针每次走一步。如果没有环,那快慢指针永远都不会相遇;如果有环,那么快慢指针肯定会相遇。
在这里插入图片描述

题目881

在这里插入图片描述

思路

题目的意思是这样的,现在需要用船来载人,一艘船最多只能载两个人,同时这两个人的体重不能超过船的最大载重limit。

使用双指针中的碰撞指针,例如体重【3,5,3,4,1,2】,limit=5的情况中,先将【】进行排序------>【1,2,3,3,4,5】,将第一个指针i放在1的位置,第二个指针j放在最后一个数,即5的位置,做一个加和判断i+j<=5?如果是,移动指针,则j-1,i+1.否则移动j-1,再做判断。具体实现代码如下:

代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值