删除排序数组中的重复项 II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

//自己思路 从2开始,比较第0号的数字是否与2号的数字相等,不相等右坐标就一直右移,直到找到不相等的数,并将它赋给第l号的位置,l++。
public int removeDuplicates(int[] nums) {
        int len = nums.length;
        if (len <= 2) {
            return len;
        }
        if (nums == null) {
            return -1;
        }
        int l = 2;
        int r = 2;
        while (r < len) {
            if (nums[l-2] != nums[r]) {
                nums[l] = nums[r];
                l++;
            }
            r++;
        }
        return l ;
    }
/*
1. 首先我们先让前 2 位直接保留,得到 1,1
2. 对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面 k 个元素不同(答案中的第一个 1),因此我们会跳过剩余的 1,将第一个 2 追加,得到 1,1,2
3. 继续这个过程,这时候是和答案中的第 2 个 1 进行对比,因此可以得到 1,1,2,2
4. 这时候和答案中的第 1 个 2 比较,只有与其不同的元素能追加到答案,因此剩余的 2 被跳过,3 被追加到答案:1,1,2,2,3
*/
public int removeDuplicates(int[] nums) {   
        return process(nums, 2);//调用时直接传入需要多少位重复的数
    }
    int process(int[] nums, int k) {
        int u = 0; //计数器
        for (int x : nums) {
            if (u < k || nums[u - k] != x) nums[u++] = x;
        }
        return u;
    }
posted @ 2021-09-20 17:32  落笔生花  阅读(12)  评论(0)    收藏  举报