概念:
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。
摘抄自力扣题解:
当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(N^2) 减少至 O(N)。为什么是 O(N)呢?这是因为在枚举的过程每一步中,「左指针」会向右移动一个位置(也就是题目中的 bb),而「右指针」会向左移动若干个位置,这个与数组的元素有关,但我们知道它一共会移动的位置数为 O(N),均摊下来,每次也向左移动一个位置,因此时间复杂度为 O(N)。
力扣题目:
11-盛水最多的容器
15-三数之和
16-最接近的三数之和
18-四个数之和
19-删除链表的倒数第N个节点 --> 快慢指针,看题解
。。。
在上面的这些题目中,如果不使用双指针直接遍历的话,时间复杂度为O(n^2),而如果使用双指针从两侧分别向中间移动,则时间复杂度可以降低为O(n)。
对于15/16,首先对数组进行排序然后再查找。
参考:
https://leetcode-cn.com/problems/3sum/solution/san-shu-zhi-he-by-leetcode-solution/
https://zhuanlan.zhihu.com/p/71643340
https://zhuanlan.zhihu.com/p/95747836