LeetCode 探索初級算法-數組:08 移動零-20200320

08 移動零-20200320

題目

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。

示例

輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

說明

  1. 必須在原數組上操作,不能拷貝額外的數組。
  2. 儘量減少操作次數。

注意事項:

  1. 不能額外開闢新空間。
  2. 注意空數組。

思路一

直接一次遍歷,找到0進行pop()操作,再將0進行insert()插到最後。

修改經歷:

1. 沒有考慮到兩個零相鄰的情況,這樣的話,循環會一直卡在這裏。(第一次提交)

  • 解答錯誤

2. 換了個思路,將pop和insert分開做,先彈出再再最後insert0。但是這個內存很是很大,每次都是14MB左右。(第二次提交)

  • 執行用時 :36 ms, 在所有 Python3 提交中擊敗了95.86%的用戶
  • 內存消耗 :14 MB, 在所有 Python3 提交中擊敗了5.02%的用戶

心得體會:

要注意while和for的區別,for裏的索引會一直增加,如果想要自己控制指針的話,還是用while好。

最終代碼展示:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums) != 0:
            length, i = len(nums), 0
            while i < len(nums):
                if nums[i] == 0:
                    nums.pop(i)
                else:
                    i += 1
                    nums.append(0)
        else:
            pass
        for _ in range(0, length-len(nums)):
            nums.append(0)
        return nums

思路二

採用雙指針,一個向前遇到0彈出,指針不變,遇到非零加一。一個向後,當彈出0時插入,並減一。最後兩個相等結束。

修改經歷:

1. 一次就成了。(第一次提交)

  • 執行用時 :36 ms, 在所有 Python3 提交中擊敗了95.86%的用戶
  • 內存消耗 :14.1 MB, 在所有 Python3 提交中擊敗了5.02%的用戶

心得體會:

當問題分析清楚了,還是很容易就解決了。

最終代碼展示:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums) != 0:
            i, j = 0, len(nums)
            while i < j:
                if nums[i] == 0:
                    nums.insert(j, 0)
                    nums.pop(i)
                    j -= 1
                else:
                    i += 1
        else:
            pass
        return nums

思路三

這個思路是從題解大神那學來的,就是交換項。兩個指針 i 和 j,i 只管向前走,遇到非零元素就和 j 交互,遇到0就pass。j 遇到非零元素元素,交換後加一。這樣,j 就會小於等於 i。開始時 i 和 j 一起走,當 i 遇到 0時跳過,此時 j 就留在了0上。所以交換時就會把0換到後面。

修改經歷:

1. 大神就是大神,服了。(第一次提交)

  • 執行用時 :28 ms, 在所有 Python3 提交中擊敗了99.59%的用戶
  • 內存消耗 :14.1 MB, 在所有 Python3 提交中擊敗了5.02%的用戶

心得體會:

這個換位的想法很妙啊,真的很妙,強烈推薦的!!有大神說這是 Cyclic Sort(循環排序)

最終代碼展示:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if len(nums) != 0:
            j = 0
            for i in range(0, len(nums)):
                if nums[i] != 0:
                    nums[i], nums[j] = nums[j], nums[i]
                    j += 1
        return nums
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章