给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的长度。
注意:不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)的额外空间条件下完成。
双指针法
1 算法分析
在排序后的数组上,我们定义两个索引变量作为指针,一个快指针(fast),一个慢指针(lower)。
借助fast和lower的对比完成:
- 若nums[fast]==nums[lower]
- fast继续后移
- 若nums[fast]!=nums[lower],说明此时找到了第一个和lower不相同的元素,只需要将lower后移,将和lower重复的元素使用fast对应的不同元素覆盖
- lower后移
- nums[lower]=nums[fast]
- fast继续后移
2 复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
3 python代码
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
slow=0
for fast in range(1,len(nums)):
if nums[slow]==nums[fast]:
continue
else:
slow+=1
nums[slow]=nums[fast]
return len(nums[0:slow+1])