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()的用法(這個在我之前學習的過程中貌似沒有見到過)。既然看懂了別人的程式,之後在做題的時候,就要盡量去提高自己的代碼品質,向大神學習,不能只是看看就算了。要向人家學習啊。