删除排序数组中的重复项

2020/03/01 算法 数组

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

解题思路

数组排序后,我们可以放置快慢指针i和j,若nums[i]=nums[j],我们就增加j以跳过重复项,若不等,则将nums[j]赋值给nums[i+1],然后递增i,直到j达到数组结尾

代码

方法1 双指针法
class Solution {
    public int removeDuplicates(int[] nums) {    
        if(nums.length == 0) return 0;
        
        int i = 0;
        for(int j=1; j<nums.length;j++){
            if(nums[i] != nums[j]){
                i++;
                nums[i] = nums[j];
            }
        }
         
        return i + 1;
    }
}
方法2 错位计算法
class Solution {
    public int removeDuplicates(int[] nums) {    
        if(nums.length == 0) return 0;
        int j = 1;
        
         for(int i = 0; i < nums.length; i++){
            if(nums[i] != nums[j-1])
                nums[j++] = nums[i];
        }
         
        return j;
    }
}

思考

若给出的数组不是已排序的怎么处理?(先排序)
若每个元素最多出现两次当怎么处理? (采用方法2,错两位即可,若出现n次,就错位n)

[题目来源]https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/submissions/

Search

    Table of Contents