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) {

        if (nums.length <= 2){
            return nums.length;
        }

        /**
         * 数组至少需要有两个元素,因此结果数组长度起始为2
         * length指的是长度,不是索引
         */
        int length = 2;

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

            /**
             * 直接从第3个元素开始遍历
             * 如果当前遍历元素不等于左边第二个元素,说明没有数字重复2次以上
             * 注意左边第二个元素是结果数组的nums[length - 2],而不是原始数组的nums[i - 2],因为原始数组中间可能有无效的重复元素
             */
            if (nums[i] != nums[length - 2]){

                nums[length] = nums[i];
                length++;
            }
        }

        return length;
    }
}

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

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

posted @ 2021-11-23 15:59  振袖秋枫问红叶  阅读(31)  评论(0)    收藏  举报