• [leetcode数组系列]3 删除排序数组中的重复项


    文章首发于公众号[我是程序员小贱]

    前言

    秋招的结束,面试了大大小小的公司,最大的问题在于算法上。所以打算坚持在leetcode打卡,看看到底能不能行,如果你想见证,那我来开车,你坐稳,一起走向更好的远方。2020=1024+996,准备好了?

    一 题目

    [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。

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

    2 思路1---快慢指针

    这里注意审题,数组本身已经排序,重复的数字就是连续的哟。

    我们先定义两个指针,慢指针i和快指针,如果num[i]=num[j],我们就让快指针j跳过重复项。如果num[i]!=num[j],那么久=nums[i++]=num[j],然后同时前进下面我们看看图。

    在这里插入图片描述

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if(nums.size()==0) return 0;
            int i=0;
            for(int j=1;j<nums.size();j++)
            {
                if(nums[j]!=nums[i])
                {
                   
                    nums[i+1]=nums[j]; 
                    i++;
                }
            }
            return i+1;
        }
    };
    

    3 思路1优化

    如果我们的排序数组没有重复的元素,按照上面的思路我们会出现多余的复制操作,所以借此可以优化一下。当num[i]!=nums[j],而且j-i>1的时候我们才进行复制,如下图所示。
    在这里插入图片描述
    优化后的代码

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if(nums.size()==0) return 0;
            int i=0;
            for(int j=1;j<nums.size();j++)
            {
                if(nums[j]!=nums[i])
                {
                   if(j-i>1)
                   {
                        nums[i+1]=nums[j];
                   }
                     
                    i++;
                }
            }
            return i+1;
        }
    };
    

    4 总结

    今天学习了快慢指针去掉重复数的问题,在后面还会遇到指针相遇等问题也会有类似的思路哟!

    希望读者和咱一起一步一个脚印去把基础知识打牢固。如果读者发现有什么错误或者不太好的地方,欢迎私我,我会及时修改,同时如果觉得文章不错点赞是对我最大的鼓励哟,同时关注就领取免费书籍和视频哈。

  • 相关阅读:
    伯努利数学习笔记
    bzoj 3864: Hero meet devil(dp套dp)
    CF1137E. Train Car Selection(可删堆)
    洛谷P3779 [SDOI2017]龙与地下城(概率论+Simpson+FFT)
    洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
    AtCoder Grand Contest 030题解
    Sort函数(C++)
    堆排序
    十进制--->二进制(利用C++栈功能)
    对局匹配
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/12151524.html
Copyright © 2020-2023  润新知