簡單系列的第二十一題對於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])
最後慣例,擺個圖,嘿嘿~