什么是双指针
双指针,是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
分类
-
快慢指针 两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。
例如:
附上双指针算法题解
var removeDuplicates = function(nums) { let j = 0 <!--i从1开始,数组第一个默认不变--> for(i=1;i<nums.length;i++){ if(nums[i]!==nums[i-1]){ j++ nums[j]=nums[i] } } return j+1 };var merge = function(nums1, m, nums2, n) { let len1 = m - 1 let len2 = n - 1 let len = m + n -1 while(len2>=0){ if(len1 < 0){ nums1[len--] = nums2[len2--] continue } nums1[len--]=nums1[len1]>nums2[len2]?nums1[len1--]:nums2[len2--] } return nums1 };var hasCycle = function(head) { let fastNode = head let slowNode = head while(fastNode){ if(!fastNode.next) return false fastNode = fastNode.next.next slowNode = slowNode.next if(fastNode === slowNode) return true } return false }; -
对撞指针
在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。(适用于有序数组)
解法一(array内置api)
var reverseString = function(s) { s.reverse() }解法二(对撞指针)
var reverseString = function(s) { let i = 0,j = s.length-1 while(i<j){ //利用数组的解构赋值 [s[i],s[j]]=[s[j],s[i]] i++ j-- } };