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个位置,就是新数组
80. 删除有序数组中的重复项II
于 2024-09-29 13:32:51 首次发布