前端算法四之双指针

221 阅读1分钟

什么是双指针

双指针,是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

分类

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

    例如:

    1、leetcode26.删除排序数组中的重复项

    附上双指针算法题解

    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
    };
    

    2、leetcode88. 合并两个有序数组

    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
    };
    

    3、leetcode141.环形链表

    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),然后从两头向中间进行数组遍历。(适用于有序数组

    例如 leetcode344.反转字符串

    解法一(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--
        }
    };