【算法】数组快慢指针技巧个人总结

32 阅读1分钟

用双指针的技巧解决数组类的问题比较常见,题目里大多会出现原地修改数组的字眼。

在数组中没有指针,我们将用索引作为指针。

⭐关键:快指针每一步都会动,而慢指针只有快指针找到符合条件的数交给慢指针才会动。

27. 移除元素

快指针找到不等于val的元素,交给慢指针,慢指针才会移动。

public int removeElement(int[] nums, int val) {
    int fast = 0,slow = 0;
    while(fast < nums.length){
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}

26. 删除有序数组中的重复项

快指针找到不重复的元素,慢指针才会移动,交给慢指针的下个位置。

public int removeDuplicates(int[] nums) {
    int slow=0,fast=0;
    while(fast < nums.length){
        if(nums[slow] != nums[fast]){
            slow++;
            nums[slow] = nums[fast];
        }
        fast++;   
    }
    return slow+1;
}

80. 删除有序数组中的重复项 II

快指针找到不重复的元素且重复但是出现次数小于2的元素,慢指针才会移动,交给慢指针的下个位置。用count计算着出现次数。

public int removeDuplicates(int[] nums) {
    if(nums.length == 0){
        return 0;
    }
    int slow=0 ,fast=0;
    int count = 0;
    while(fast < nums.length){
        if(nums[slow] != nums[fast]){
            slow ++;
            nums[slow] = nums[fast];
        } else if(slow < fast && count < 2){
            slow ++;
            nums[slow] = nums[fast];
        }
        fast++;
        count++;
        if( fast<nums.length && nums[fast]!=nums[fast-1]){
            count = 0;
        }
    }
    return slow + 1;
}

283. 移动零

快指针找到不为0的元素,交给慢指针,慢指针才会移动。注意最后把数组后的元素都赋值为0。

public void moveZeroes(int[] nums) {
    int slow = 0, fast = 0;
    while(fast<nums.length){
        if(nums[fast] != 0){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    for(int i=slow;i<nums.length;i++){
        nums[i] = 0;
    }
}