题目:删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
1 | 给定数组 nums = [1,1,2], |
示例 2:
1 | 给定 nums = [0,0,1,1,1,2,2,3,3,4], |
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
1 | // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 |
思路
这题的题目表述稍微有点绕,其实意思比较简单,给定一个有序数组,存在重复的情况,要求在不新建一个数组的情况下,无视重复的数组,把非重复的数值往往前移动,并返回非重复数组的长度。
比如给定:
1 | nums = [0,0,1,1,1,2,2,3,3,4] |
处理完后的数组为:
1 | nums = [0,1,2,3,4,2,2,3,3,4] |
返回值为5,系统会自动输出前5个数:
1 | [0,1,2,3,4] |
可以用双指针法:
- 初始化指针
i
从0开始,j
从1开始一直遍历到len(lists)
- 如果
j
指向的数与i
指向的数一样,那么继续遍历 - 如果
j
指向的数与i
指向的数不一样,那么把i
指向的数修改为j
指向的数并继续 - 最后返回长度是
i+1
,此时数组中前i+1
个数也都是非重复的数值了。
实现:
1 | class Solution: |
如果大家有更好的方法,欢迎一起探讨。