class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        while i+1 < len(nums):
            if nums[i] == nums[i+1]:
                del nums[i+1]
            else:
                i = i+1
        return len(nums)
             

思想:比较当前与下一个的值,若相等,则删除下一个,若不等,则将下一个视为当前值,重复此过程。

注意:

while的用法

list的性质

nums(max)中的max等于len-1,即是从nums[0]作为第一项。

 print(" %s " % s) 的用法

删除List的方法

官方题解:

方法:双指针法

算法

数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。

当我们遇到 nums[j] ≠nums [i] 时,跳过重复项的运行已经结束,因此我们把Nums[j]的值复制到 nums[i + 1]。然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。

这道题必须要搞清楚的是这里函数调用传递的数组是引用传递而不是值传递。

由于数组是可以直接用游标来当指针,所以刚开始我们定义的两个快慢指针指向同一个地址

复杂度分析

  • 时间复杂度:O(n), 假设数组的长度是 n,那么 i 和 j 分别最多遍历 n 步。

  • 空间复杂度:O(1)。