常用算法思想之双指针法

如大家所熟悉的,双指针法( Two Pointers ,又称为尺取法)是算法竞赛中一个常用的优化技巧,用来解决易于使用和编程序列的区间问题。如果区间是单调的,也常常用二分法求解,所以很多问题用尺取法和二分法都行。另外,双指针法的操作过程和分治算法的步骤很相似,有时也用在分治中。

双指针法是一种常用的算法思想,用于解决数组和链表等数据结构的问题。它的基本思想是使用两个指针在数据结构中同时移动,以便有效地查找或比较元素。在数组中,通常使用两个指针从两端向中间移动,以便查找满足特定条件的元素。在链表中,通常使用两个指针以不同的速度移动,以便在链表中查找环或回文字符串等问题。双指针法也可以用于优化时间复杂度,例如 : 快速排序和归并排序等算法中常常使用双指针法。

考虑下面的应用背景:

(1)给定一个序列,有时需要它是有序的,先排序;

(2)问题和序列的区间有关,且需要操作两个变量,可以用两个下标(指针)i 和 j 扫描区间。

例如,如果问题是找到数组中的两个数,使它们的和等于目标数,我们可以使用双指针。我们可以将数组排序,然后使用两个指针,一个指向数组的开头,另一个指向数组的结尾。然后,我们可以将这两个指针相向移动,如果两个指针指向的数的和等于目标数,则返回这两个数的索引。如果和大于目标数,则将右指针左移,如果和小于目标数,则将左指针右移。

这个问题还可以使用二分法或哈希表解决。双指针法不仅效率很高,而且不需要额外的空间。

双指针法有两种扫描方向:

(1)同向扫描,i 和 j 方向相同,都从头到尾,但速度不同,所以i和j被称为"快慢指针"。

(2)反向扫描,i 和 j 方向相反,i 从头到尾,j 从尾到头,在中间相会。

双指针法还可以用于数组去重:

1.将数组排序,排序后相同的数会紧挨在一起,定义双指针i和j,初始值都指向 a0 ,i 和 j 都从头到尾扫描数组a\[\] 。i 指针走得快,遍历整个数组,j 指针走得慢,它始终指向当前不重复部分的最后一个数。

2.扫描数组,快指针执行 i++ ,如果此时 ai 不等于 aj ,就执行 j++ ,并且把 ai 复制到慢指针 j 的当前位置aj

  1. i 扫描结束后,得到的 a0~aj 就是去重后的数组。