iT邦幫忙

0

leetcode with python:283. Move Zeroes

  • 分享至 

  • xImage
  •  

題目:

Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

給定一個陣列,將0移到陣列最後,其餘非0元素維持原來的順序
且不能使用新的陣列來進行操作
ex:input:[0,1,0,3,12]=>output:[1,3,12,0,0]

我用兩個指標一個代表0的位置,一個代表非0元素的位置來實作

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

兩個指標,i專門走0,j專門走非0
如果j位置>i位置且j的位置非0,兩者的元素互換
i跑到下一個0,其餘狀況就是j繼續往前走
j遍歷完後我們要的陣列也形成了
最後執行時間187ms(faster than 83.39%)

但在看討論區時我才發現,"將0移到陣列後"不就等於"將非0元素移到陣列前"嗎
我居然沒有想到,所以操作其實可以不像上面那樣繁雜

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        pos=0
        for i in range(len(nums)):
            if nums[i]!=0:
                temp=nums[i]
                nums[i]=nums[pos]
                nums[pos]=temp
                pos=pos+1

一個指標pos表下次存放位置,一個指標i開始搜尋非0元素
i開始遍歷,一遇到非0元素就和pos的元素互換
pos前往下一個位置
i遍歷完後就達成把所有非0元素順序不變的往前移了
最後執行時間161ms(faster than 98.76%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言