严格的来说,双指针只能说是是算法中的一种技巧。
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。双指针可以从不同的方向向中间逼近,即对撞指针,也可以朝着同一个方向遍历,即快慢指针。
通俗的说,就是在数组遍历中,我们使用两个指针进行操作。所以双指针问题基本有以下几个细节:
根据双指针的分类,都各有两种可能,具体如下。
对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left)
,最右侧的定义为右指针(right)
,然后从两头向中间进行数组遍历。快速排序就是典型的双指针问题。
我们假设数组名字为 nums,数组长度为 n,数组首元素对应的位置为 0。
left = 0
。right = n-1
。left++
。right--
。从上面的描述可知,开始的时候,left <= right
。因此结束的条件就是 left > right
。
快慢指针 指的是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)
和慢指针(slow)
,两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如快指针(fast)每次增长两个,慢指针(slow)每次增长一个。
一般来说,快慢指针常用于判断链表等数据结构中是否有环。
slow = 0
。fast = 0
。slow++
。fast += 2
。特别注意,要判断达到最后一个元素。否则会出现死循环。
算法之双指针编程案例