有序数组去重I&II

I

26. 删除有序数组中的重复项 - 力扣(LeetCode)

难度:Easy

要求原地去重后返回数组长度,可以使用双指针,fast在前扫描,发现新元素就赋值给slow并让slow前进一步,slow走过的地方只有不重复的元素。

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

II

80. 删除有序数组中的重复项 II - 力扣(LeetCode)

难度:Medium

依旧是原地删除,但要求删除出现两次以上的。所以这次除了判断是否相等,还要判断重复的次数。

出现一次添加(即slow前进),出现第二次也添加。

我们在每出现一个新元素时就重新计数,以此保证count始终计算的是同一个数字的出现次数。

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int slow = 0, fast = 0,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;
    }
}