【快慢指针】通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作
-
快指针:在原数组中寻找新数组的元素,新数组就是不含有目标元素的数组
-
慢指针:指向更新新数组下标的位置
例如【移除元素】【移动零】【链表的中间结点】
【LeetCode844. 比较含退格的字符串】本题可用双指针实现,分别指向S、T中相应的字符,由于 # 号只会消除左边的一个字符,所以对右边的字符无影响,故选择从后往前遍历 S,T 字符串。
很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后从后向前进行操作。 两个好处:
- 不用申请新数组
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题
【LeetCode977.有序数组的平方 】在遍历方式上同样有技巧,并且也用到双指针的思想。数组平方的最大值在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法,i指向起始位置,j指向终止位置。之后利用两端的数值平方的大小比较来决定先unshift哪一方。
【LeetCode15.三数之和】首先将数组排序,然后用一层for循环,i从下标0的地方开始,同时定一个下标left定义在i+1的位置上,定义下标right在数组结尾的位置上;在数组中找到 abc 使得a + b +c =0,相当于 a = nums[i],b = nums[left],c = nums[right];通过三数之和与0相比的大小情况来决定指针如何移动:如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些;如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止;在这个过程中也需要去重,可以用 nums[i] == nums[i - 1] 是否成立来决定是否需要continue,注意这里是i与i-1;此外,对于另外两个数的去重:
【相向双指针】一个指针从左向右一个指针从右向左。从左向右的找等于目标值的位置从右向左找不等于目标值的位置,然后每次找到一个用不等于的覆盖等于的。
【图源:公众号 吴师兄学算法】