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])

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章