80. 删除有序数组中的重复项II

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # 方法1
        # 滑动窗口思想, 有一个宽度为3的滑动窗口,比较窗口内的值是否全等
        # 如果全等,就删除第一个值,那i的位置就不变,因为需要重新判断删除后的nums
        # 如果没有删除,则i+= 1 ,i往前移动一位
        # old_len = len(nums)
        # count = 0
        # i = 0
        # while i < len(nums): 

        #     if i < len(nums) -2:
        #         # 如果连有续3个数相同
        #         if nums[i] == nums[i+1] == nums[i+2]:
        #             nums.remove(nums[i])
        #         else:
        #             i += 1
        #     else:
        #         break

        # return len(nums)

        # 方法2  双指针思想
        left, right = 0, 0  
        # 左指针的右侧是处理好的序列,左指针指向的位置是用于待存储的位置
        # 右指针指向的位置是判断是否加入处理好的序列
        # 有点像个毛毛虫,left,right指向毛毛虫的首尾段
        # 如果这个数不符合要求,就吸收到毛毛虫里面去,left~right之间的都是不符合要求的数
        count = 0
        while right < len(nums):
            if left < 2:
                left += 1
                right += 1
                count += 1
            else:
                if nums[right] == nums[left - 1] == nums[left - 2]:
                    right += 1
                else:
                    nums[left] = nums[right]
                    left += 1
                    right += 1
                    count += 1
        return count

        # 解释一下为啥只需要返回count,而不需要返回nums
        # 因为nums是用指针来存储的,指针指向了数组的头部
        # 所以返回的count,也就是返回了这个数组的长度,那从指针的头部,往后数count个位置,就是新数组
            






                    
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值