leetcode每日一题(2021.5.10)——删除有序数组中的重复项

题目:删除有序数组中的重复项(简单)

一、题目描述  

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

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

示例:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

 

二、解答思路

  首先,不能使用额外的数组空间,且限定了本题的空间复杂度O(1),新数组只能在原数组的基础上修改,所以可以参考数据结构中顺序表的删除操作,直接让后续元素依次覆盖前一元素。

  因为数组是有序的,所以相同元素只能连续出现,理论上当遍历到的一个元素与他的后继相同时,应该越过和他相同的元素找到下一个和他不同的那个元素,让这个不同 的元素作为他的后继。

  举个例子:设数组是{0,0,0,2,3,3,4}在遍历到第一个0时,因为他和下一个元素值相同,所以应该继续向后遍历直到元素2,这时应该把第一个0和当前遍历的这个2链接起来,后面也是同理。

  算法:

  1、设置两个指针p和q用于对数组的遍历,初始化p,q=0;

  2、移动指针q,并且每次移动都比较p和q指向的值,如果相同则q++(后移q),如果不同则num[p+1]=num[q](把q指向的值赋给p的下一个元素)且p++(操作完成后移p)

  3、当q遍历到最后一个元素时(q=num.length-1)终止循环,因为只有对元素进行覆盖操作时p才自增,所以可以用p+1表示数组长度,最后返回p+1就行。

  4、考虑特殊情况,数组长度为0和数组长度为1时根本不需要遍历或者修改数组,可以直接返回当前传入的数组长度。

 

三、代码

  

 

   

 

 

  代码分析:时间复杂度:因为只用到一个循环,时间复杂度为O(n);空间复杂度:用到了有限的变量所以空间复杂度为O(1);

 

四、总结

  这是一道很基础的数据结构关于线性表的题,我猜测这道题是由线性表元素的删除演变而来的题,对我来说难度不算大,算法也是很好想的。

posted @ 2021-05-10 21:41  瑜琦  阅读(228)  评论(0)    收藏  举报