LeetCode題庫第二十六題(簡單系列)
阿新 • • 發佈:2019-01-31
簡單系列的第二十一題對於Python有序連結暫時沒有弄明白是怎麼操作的,只是看了別人大神的程式碼過了,所以暫時不寫。
現在由二十六題開始繼續做題。
題目:
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1,2 你不需要考慮陣列中超出新長度後面的元素。
嘗試程式碼第一遍
class Solution: def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ for i in nums: n=nums.count(i)#4 n2 = nums.index(i) count=0 while count<n-1: nums.pop(n2+1) count=count+1 return len(nums)
以上程式碼到LeetCode的最後一個測試題的時候掛掉了,timeout,多麼讓人熟悉的字眼。這說明我的程式碼還不夠優化,可應該沒有符合O(1)這個標準。所以需要再次改進這段程式碼。
嘗試程式碼第二遍
class Solution: def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ n=len(set(nums)) while n!=len(nums): for i in nums: ns=nums.count(i) if ns>1: nums.remove(i) return len(nums)
又出現了timeout,W( ̄_ ̄)W
ε=(´ο`*)))唉,繼續想,是因為既有while迴圈又有for遍歷麼,所以程式執行佔的記憶體和時間的耗時都多麼……
思考了一天,感覺還是需要用遍歷和迴圈,於是在網上搜索了一下其他大神的答案,然後給出了一個思路的是【26-30】LeetCode:Python解題這位大神的程式碼。
看到這個解題的時候,才發現自己的想法就錯了,因為題目中有原地刪除,所以首先想到的是列表中的remove和pop,在這兩個方法都嘗試了一遍之後,我選擇的是用pop來做題。所以一直困在了遍歷、迴圈、計數這個思路中無法自拔。
但是看到了上面大神的程式碼之後,在回去看了一遍題目,發現裡面的示例中還寫“你不需要考慮陣列中超出新長度後面的元素”, 所以後面實際上是可以有多餘的數字的。然後原地刪除,除了刪除,其實還可以賦值。這個是一個需要學習的思路!!!
現在擺上我理解和借鑑之後的程式碼,嘛,這個是通過的哦~
成功程式碼:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
s=0
s1=len(set(nums))
for i in range(1,n):
if nums[i]!=nums[s]:
s+=1
nums[s]=nums[i]
return len(nums[:s1])
最後慣例,擺個圖,嘿嘿~