26. 删除排序数组中的重复项

 

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

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

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

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

示例 2:

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

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

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

 

在这里给新人一些提示,LeetCode中需要提交的代码之是真正程序的一个函数,

LeetCode会提供接口以便测试准备好的测试用例来判断题目是否被解决

 

我的代码1//报错,改变了数组顺序

输入:[0,0,1,1,1,2,2,3,3,4]
输出:[0,4,1,3,2]
预期:[0,1,2,3,4]
int removeDuplicates(int* nums, int numsSize) {
    for (int i=0; i<numsSize; i++){
        for (int j=i+1; j<numsSize; j++){
            if (nums[i] == nums[j]){
                nums[j] = nums[numsSize-1];
                numsSize--;
            }
        }
    }
    return numsSize;
}

我的代码2//虽然通过了,但是耗时极其长

int removeDuplicates(int* nums, int numsSize) {
    for (int i=0; i<numsSize; i++){
        for (int j=i+1; j<numsSize; j++){
            if (nums[i] == nums[j]){
                for (int k=j; k<numsSize-1; k++){
                    nums[k] = nums[k+1];          
                }
                numsSize--;
                j--;
            }
        }
    }
    return numsSize;
}

 

范例代码1//忘记了这道题是一个有序数组,比较相邻两位即可,而且需要注意对numsSize<=1的判断,循环中的内容也是意想不到的,设计了一个如果两数不同就递增的变量,代替numsSize

int removeDuplicates(int* nums, int numsSize) {
    int i , j = 0;
    int num;
    if(numsSize <= 1)
        return numsSize;
    for(i = 1; i < numsSize; i++)
    {
        if( nums[j] != nums[i])
        {
            nums[++j] = nums[i];
        }
    }
    return j+1;
}

范例代码2//同样,循环中的内容值得学习

int removeDuplicates(int* nums, int numsSize)
{
    if(numsSize==0)return 0;
    int count=1;
    int temp=nums[0];
    
    //int prev;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>temp)
        {
            temp=nums[i];
            nums[count]=temp;
            count++;            
        }
    }return count;
}

 

题目目的很明确,考察排序数组中对于重复项的检验以及数组原地删除