80. 删除有序数组中的重复项 II
1.题目
2.我的解决方案
- 限制i~j的长度为3,比较 n u m s [ i ] nums[i] nums[i]和 n u m s [ j ] nums[j] nums[j],这种情况下相等的话,进行删除
- 删除的数组长度是动态变化的,所以要用 l e n ( n u m s ) len(nums) len(nums)对 j j j进行判断,防止索引溢出造成的错误
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
for i in range(len(nums)-2):
j = i+2
while j< len(nums) and nums[i] == nums[j]:
# 注:必须是j < len(nums)在前,不然后面的nums[i]会造成索引溢出
nums.pop(j)
return len(nums)
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( 1 ) O(1) O(1)
3.官方的解决方案
- 理解上有难度
- 0~slow-1表示已经处理出的数组元素的索引
- slow表示需要被覆盖的数组元素的索引
- fast表示正在被检查的数组元素,的索引
- slow和fast之间都是一些重复的元素
- 如果fast指向的元素和slow-2对应的元素相等了,说明fast指向的元素出现大于了2次(因为数组是有序数组,所以这个结论是一定的),不做处理,fast继续遍历,不相等,说明是新的数,可容纳进数组,使用nums[fast]覆盖nums[slow]
- 优点:没有使用pop()函数进行偷懒,更加符合数据结构的思路
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
n = len(nums)
if n <= 2:
return n
slow = 2
for fast in range(2, len(nums)):
if nums[fast] != nums[slow-2]:
nums[slow] = nums[fast]
slow += 1
return slow
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)