1. 程式人生 > >LeetCode題庫第二十六題(簡單系列)

LeetCode題庫第二十六題(簡單系列)

簡單系列的第二十一題對於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])

 最後慣例,擺個圖,嘿嘿~