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函数

错误二:这样做相当于是重新开辟了空间并赋值给num,违背了题意,虽然在自己的编译器上可以

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-10-13 11:09  niuaniu  阅读(126)  评论(0)    收藏  举报