【LeetCode刷题-双指针】--80.删除有序数组中的重复项II

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

【LeetCode刷题-双指针】--80.删除有序数组中的重复项II_第1张图片

方法:双指针

因为给定数组是有序的,所以相同元素必然连续,使用双指针解决,遍历数组检查每一个元素是否应该被保留,如果应该保留,就将其移动到指定位置。我们定义两个指针slow和fast分别为慢指针和快指针,其中慢指针表示处理出的数组长度,快指针表示已经检查过的数组的长度,即nums[fast]表示待检查的第一个元素,nums[slow-1]为上一个应该被保留的元素所移动到的指定位置

本题要求相同元素最多出现两次而非一次,所以需要检查上上个应该被保留的元素nums[slow-2]是否和当前待检查的元素nums[fast]相同。当且仅当nums[slow-2]=nums[fast]时,当前待检查元素nums[fast]不应该被保留(因为此时必然有nums[slow-2]=nums[slow-1]=nums[fast]),最后slow即为处理好的数组的长度

特别地,数组的前两个数必然可以被保留,因此对于长度不超过2的数组,无需进行任何处理,对于长度超过2的数组,直接将双指针的初始值设为2即可

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if(n<=2){
            return n;
        }
        int slow = 2,fast = 2;
        while(fast < n){        
            if(nums[slow - 2]!= nums[fast]){
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法)