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

网友投稿 242 2022-10-18


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

前言

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

一 题目

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

1 leetcode原文链接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& nums) {        if(nums.size()==0) return 0;        int i=0;        for(int j=1;j

3 思路1优化

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

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

4 总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java线程的并发工具类实现原理解析
下一篇:[leetcode数组系列]2三数之和
相关文章

 发表评论

暂时没有评论,来抢沙发吧~