算法思想之双指针

1、什么是双指针

严格的来说,双指针只能说是是算法中的一种技巧。

双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。双指针可以从不同的方向向中间逼近,即对撞指针,也可以朝着同一个方向遍历,即快慢指针

2、双指针问题细节

通俗的说,就是在数组遍历中,我们使用两个指针进行操作。所以双指针问题基本有以下几个细节:

  1. 双指针的初始位置。
  2. 双指针的移动方法。
  3. 遍历的结束条件。

根据双指针的分类,都各有两种可能,具体如下。

3、对撞指针

对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。快速排序就是典型的双指针问题。

我们假设数组名字为 nums,数组长度为 n,数组首元素对应的位置为 0。

代码细节:

(1)指针初始位置
  • 左指针(left) 一般指向数组的第一个元素。即 left = 0
  • 右指针(right) 一般指向数组的最后一个元素。即 right = n-1
(2)指针移动方法
  • 左指针(left)向右边移动,一般每次移动一个位置,即 left++
  • 右指针(right)向左边移动,一般每次移动一个位置,即 right--
(3)结束条件
  • 左指针(left)位置和右指针(right)位置逆序。

从上面的描述可知,开始的时候,left <= right。因此结束的条件就是 left > right

4、快慢指针

快慢指针 指的是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如快指针(fast)每次增长两个,慢指针(slow)每次增长一个。

一般来说,快慢指针常用于判断链表等数据结构中是否有环。

代码细节:

(1)指针初始位置
  • 慢指针(slow)一般指向数组的第一个元素。即 slow = 0
  • 快指针(fast)一般指向数组的第一个元素。即 fast = 0
(2)指针移动方法
  • 慢指针(slow)向右边移动,一般每次移动一个位置,即 slow++
  • 快指针(fast)向右边移动,一般每次移动两个个位置,即 fast += 2
(3)结束条件
  • 慢指针(slow)位置和快指针(fast)位置重合;快指针(fast)到达数组的最后一个元素。

特别注意,要判断达到最后一个元素。否则会出现死循环。

5、双指针案例

算法之双指针编程案例

你可能感兴趣的:(算法,算法)