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

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

 

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

 

示例 1:

 

给定 nums = [1,1,1,2,2,3],

 

函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。

 

你不需要考虑数组中超出新长度后面的元素。

示例 2:

 

给定 nums = [0,0,1,1,1,1,2,3,3],

 

函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。

 

你不需要考虑数组中超出新长度后面的元素。

说明:

 

为什么返回数值是整数,但输出的答案是数组呢?

 

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

 

你可以想象内部操作如下:

 

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

int len = removeDuplicates(nums);

 

// 在函数里修改输入数组对于调用者是可见的。

// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

for (int i = 0; i < len; i++) {

    print(nums[i]);

}

 

 

需要替换数组元素,需要两个指针,左侧指针指向结果的尾结点,右侧指针指向目前正在遍历的数组节点,当右侧指针遍历到最后时退出,设置一个标志当前左侧指针指向数字的出现次数,当两个指针代表的数字不相等时,说明左侧指针要加1,也就是结果数组长度增加1,当计数大于2时说明之前的左侧指针指向的数字已经重复次数超过2辞了,所以就需要替换当前左侧指针的元素,或者当右侧指针大于当前左侧指针时,说明中间存在前面重复的数字,也需要替换,最后重置当前左侧指针数字的计数为1。当左右侧指针的数字相等时,计数小于2的话说明还没有到限制,左侧指针右移,还需要判断下右侧是否大于右移后的左侧下标,如果没有任何超过限制的重复数字出现的话,右侧会等于右移后的左侧下标,替换左侧下标值,计数递加,右侧指针一直递加。

public static int removeDuplicates(int[] nums) {
    int left = 0;
    int right = 1;
    int num = 1;
    while (right < nums.length) {
        if (nums[right] != nums[left]) {
            left++;
            if (num > 2) {
                nums[left] = nums[right];
            } else if (right > left) {
                nums[left] = nums[right];
            }
            num = 1;
        } else {
            if (num < 2) {
                left++;
                if (right > left) {
                    nums[left] = nums[right];
                }
            }
            num++;
        }
        right++;
    }
    return left + 1;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值