定义
普通
对撞:一个在头,一个在尾,对撞着移动。
快慢
例子
有序数组(排列好的数组)
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,再做判断。具体实现代码如下:
代码