Given a sorted array, remove the duplicates in-place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
题目分析:给定一个已经排好序的数组。要求删掉其中重复的数,然后返回排好序的新数组长度。
方法一:
- 思路:这道题是我做过的最简单的一道了,时间复杂度为O(n)。不做多余解释了,直接上代码。
- 代码:(可以提交)
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a=0 #用做计数
length=len(nums)
if length<2:
return length
for i in range(1,length):
if nums[a]!=nums[i]:
a+=1
nums[a]=nums[i]
a+=1
return a
方法二:
- 划重点:这是提交后看到其他大神的写法,简直是牛逼哄哄啊,一开始都没看懂,时间复杂度比我的低多了是O(1)啊。放上来大家欣赏一下,我也顺便做个简单的解说(自我理解,有错误请纠正)
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums[:]=sorted(list(set(nums)))
'''这就是大神和我这等凡人的区别,人家的代码只要一行就可以。
其实吧我觉得最后还应该再加一行return len(nums) 因为题目要求你返回一个长度。
但是我发现LeetCode对这道题的检验标准是看你处理后的数组。并没有看他的长度是多少,
所以return len(nums)可有可无。只是既然题目要求了这里还是说一下吧。'''
针对这唯一一行的代码做的个分析:
- 首先从最内层的括号开始看起,也就是set(nums) #set这个方法是进行一个(无序,不重复)的处理,这一步就直接去掉了nums中所有重复的元素,但打乱了原本排好的顺序,也将列表变成了元组(注意看下面例子中的括号就可以区分元组和列表)。下面给大家看一个从别人博客上扒下来的小李子:
>>> x = set('spam')
>>> y = set(['h','a','m'])
>>> x, y
(set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))
>>> x & y # 交集
set(['a', 'm'])
>>> x | y # 并集
set(['a', 'p', 's', 'h', 'm'])
>>> x - y # 差集
set(['p', 's'])
2.第二层括号list(… …) #将我在上一步中提到的元组(set的副作用)变回列表形式。
3.到最外层的括号了sorted()#返回一个经过排序的新列表,不覆盖之前的列表。这里来复习一下sort()和sorted()的区别:
>>>a=[3,2,1,4,5]
>>>b=sorted(a)
>>>a,b
[3,2,1,4,5],[1,2,3,4,5]
>>>a.sort()
>>>a
[1,2,3,4,5]
4.将结果附给nums[:] #此时的nums就变成了一个无重复并以排好序的数组。
总结:在看大神的程序时,重新复习了一下之前的知识,并了解了set()的用法(这个在我之前学习的过程中貌似没有见到过)。既然看懂了别人的程序,之后在做题的时候,就要尽量去提高自己的代码质量,向大神学习,不能只是看看就算了。要向人家学习啊。