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

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

题目描述:

给定一个增序排列数组 nums ,你需要在 原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
   print(nums[i]);
}
提示:
   0 <= nums.length <= 3 * 10^4
   -10 ^4 <= nums[i] <= 10 ^4
   nums 按递增顺序排列

题目链接

class Solution {
    
    
    private int len;
    private int[] nums;
    public int removeDuplicates(int[] nums) {
    
    
        this.len = nums.length;
        this.nums = nums;
        int result = this.len;
        if(len == 1) return 1; // 特判

        int count = 1;
        for(int i = 0 ; i<len-1 ;){
    
    
            if(i+1 == result) break; // 结束判断:i+1一定等于result时结束,因为result的值一定大于等于i+1
            if(count < 2 && nums[i] == nums[i+1]){
    
    
                count++;
                i++;
            }else if(count>=2 && nums[i] == nums[i+1]){
    
    
                move(i+1);
                result --;
            }else{
    
    
                count = 1; // 重置为1                
                i++;
            }
        }
        return result;
    }
    private void move(int start){
    
    
        for(int i = start ; i<len-1 ; i++){
    
    
            nums[i] = nums[i+1];
        }
    }
}

按照题意即可,每次当前的数字连续超过两个时,则将该多余的数字用后面的数字覆盖。这里需要注意的是:结束条件应该有两个,一个就是i遍历完整个nums时,另一个就是当i+1等于result时。详细请看代码,有疑问欢迎留言。

猜你喜欢

转载自blog.csdn.net/weixin_43914658/article/details/113827234