LeetCode刷题
阶段一:初级算法补基础
https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/
1.数组
26.删除排序数组中的重复项
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
1 示例1: 2 输入:[1,1,2] 3 返回数组的长度为2,且原数组被修改为1,2 4 示例2: 5 输入:[-1,0,0,2,3] 6 输出:[-1,0,2,3]
思考:
这个题我首先想到的就是将列表变为集合,直接去重,但是这样做就是开辟了一些新的空间,如下所示, 错误一:当数组中存在负数时,集合是不会自动排序的,所以要加上sorted函数
1 class Solution: 2 def removeDuplicates(self, nums: List[int]) -> int: 3 nums = list(set(nums)) 4 return len(nums)
正解:
num[:]为啥可以通过,好像说是浅拷贝,这个我有点不太懂,后面再看看。
还要注意返回值是一个数int型的,而不是更改后的列表
1 class Solution: 2 def removeDuplicates(self, nums: List[int]) -> int: 3 nums[:] = sorted(list(set(nums))) 4 return len(nums)
官方解法:双指针
双指针法将时间复杂度O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,

1 class Solution: 2 def removeDuplicates(self, nums: List[int]) -> int: 3 if not nums: 4 return 0 5 showindex=0 6 fastindex=0 7 while fastindex < len(nums)-1: 8 if nums[fastindex] != nums[fastindex+1]: 9 showindex += 1 10 nums[showindex] = nums[fastindex+1] 11 fastindex += 1 12 return showindex+1
开心,有收获,就好

浙公网安备 33010602011771号