zoukankan      html  css  js  c++  java
  • 删除排序数组中的重复项

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

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 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。

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

    解题思路:

    解法: 双指针

    首先注意数组是有序的,那么重复的元素一定会相邻。

    要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。

    考虑用 2 个指针,一个在前记作 p,一个在后记作 q,算法流程如下:

    1.比较 p 和 q 位置的元素是否相等。

    如果相等,q 后移 1 位
    如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位
    重复上述过程,直到 q 等于数组长度。

    返回 p + 1,即为新数组长度。

    画个图理解一下


     代码实现:

    int removeDuplicates(int* nums, int numsSize){
        if(numsSize == 0 || nums == NULL){
            return 0;
        }
        int p=0;
        int q=1;
        while(q<numsSize){
            if(nums[p] == nums[q]){
                q++;
            }else{
                nums[p+1]=nums[q];
                p++;
                q++;
            }

        }
        return p+1;
    }

    精简之后的代码如下:

    int removeDuplicates(int* nums, int numsSize){
        if(numsSize == 0 || nums == NULL){
            return 0;
        }
        int p=0;
        int q=1;
        while(q<numsSize){
            if(nums[p] !=nums[q]){
                nums[p+1]=nums[q];
                p++;
            }
             q++;

        }
        return p+1;
    }

    优化:

    复杂度分析:

    时间复杂度:O(n)O(n)O(n)。
    空间复杂度:O(1)O(1)O(1)。

    优化:

    这是大部分题解都没有提出的,在这里提一下。

    考虑如下数组:

    此时数组中没有重复元素,按照上面的方法,每次比较时 nums[p] 都不等于 nums[q],因此就会将 q 指向的元素原地复制一遍,这个操作其实是不必要的。

    因此我们可以添加一个小判断,当 q - p > 1 时,才进行复制。

    优化之后的代码:

    int removeDuplicates(int* nums, int numsSize){
        if(numsSize == 0 || nums == NULL){
            return 0;
        }
        int p=0;
        int q=1;
        while(q<numsSize){
            if(nums[p] !=nums[q]){
                if(q-p >1){
                    nums[p+1]=nums[q];
                }
                p++;
            }
             q++;

        }
        return p+1;
    }



    作者:max-LFszNScOfE
    链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-shan-chu-zhong-fu-xiang-dai-you-hu/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12459722.html
Copyright © 2011-2022 走看看