前往leetcode做此题

解题思路

因为nums是一个排序数组,所以重复项只会出现在相邻的位置。可以通过双指针的方式来指定其中的元素,然后逐步往后移动进行比对,直到找到相邻且相等的元素删除即可。有一点要注意的是,如果连续出现三个重复的元素,用两两比对会漏掉一个,这个时候需以第一个重复元素为参照物进行比对,直到删除了所有的重复项后再往后移动。

代码实现

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        left, right = 0, 1
        while right < len(nums):
            if nums[left] == nums[right]:
                nums.pop(right)
            else:
                left += 1
                right += 1
        return len(nums)

复杂度分析

时间复杂度: O(N) N表示数组长度,算法最多执行N次

空间复杂度: O(1) 由于对nums是原地操作的,不存在多余的空间使用所以是O(1)