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


双指针法

class Solution {
    public int removeDuplicates(int[] nums) {

        /**
         * 双指针遍历数组
         * 定义一个flag来指示重复元素出现的次数
         */
        int n = 0;
        int flag = 0;

        for (int i = 1; i < nums.length; i++) {

            if (nums[n] < nums[i]){

                n++;

                if (i != n) {
                    nums[n] = nums[i];
                }

                flag = 0;
            }

            /**
             * flag等于0时进入该判断,说明元素刚好重复了两次
             * 此时累计flag,n的下一个元素肯定需要被覆盖
             */
            else if (flag < 1){

                flag++;
                n++;
                nums[n] = nums[i];
            }

            /**
             * 如果重复次数超过2,就让i一直往前遍历
             */
            else if (flag == 1){
                continue;
            }
        }

        return n + 1;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——以2为间隔进行判断

class Solution {
    public int removeDuplicates(int[] nums) {

        /**
         * 双指针遍历数组,数组长度小于等于2时不用处理
         * 当前元素i大于n - 2时说明重复次数小于等于2
         */
        if (nums.length <= 2){
            return nums.length;
        }

        int n = 2;

        for (int i = 2; i < nums.length; i++) {

            if (nums[n - 2] < nums[i]){

                if (n != i) {
                    nums[n] = nums[i];
                }
                
                n++;
            }
        }

        return n;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/