LeetCode第283題解法與思考

2021-10-01 19:13:15 字數 1765 閱讀 9923

第283題的要求如下:

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

示例:輸入: [0,1,0,3,12]

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

說明:必須在原陣列上操作,不能拷貝額外的陣列。

儘量減少操作次數。

題目的難點在於,不能使用額外的記憶體空間,必須在原陣列上操作

。我想到的常規解法有如下三種,但都不是非常滿意,具體如下:

'''#1: 常規方法,輪詢值為0的元素,執行remove操作,並記錄操作次數,最後按照刪除次數將0新增到列表。用時180ms'''

def movezeroes1(nums):

cts = 0

i = 0

while (i < len(nums)):

if (nums[i] == 0):

nums.remove(0)

cts += 1

i = (i-1) if i>=1 else 0

else:

i += 1

while (cts != 0):

cts -= 1

return nums

'''#2: 直接使用remove操作,記錄remove次數,發生異常時break,最後按照remove次數將0新增到列表。耗時164ms'''

def movezeroes2(nums):

j = 0

for i in range(len(nums)):

try:

nums.remove(0)

j += 1

except valueerror:

break

while (j != 0):

j -= 1

return nums

'''#3: 按照元素0存在的次數進行單次氣泡排序。耗時1604ms'''

def movezeroes3(nums):

for k in range(nums.count(0)):

for i in range(len(nums)-1):

j = i + 1

if (nums[i] == 0):

nums[i], nums[j] = nums[j], nums[i]

return nums

以上三種方法,雖然都滿足要求,也都通過了,但效率都不高,特別是第三種,耗時更是長達1604ms,幾乎快要timeout了。前面兩種雖然好一些,但是都使用了remove方法,感覺也不是太好,但沒辦法,自己思維打不開,想不到更好的,直到看見了肖哥的如下解法,我才豁然開朗:

'''#4: 肖哥的方法,遍歷列表,將非零的元素從0位置開始覆蓋,剩餘位置用0來覆蓋. 44ms,效率非常高!!'''

def movezeroes4(nums):

none_zero_item = 0

for each in nums:

if (each != 0):

nums[none_zero_item] = each

none_zero_item += 1

for i in range(none_zero_item, len(nums)):

nums[i] = 0

return nums

不得不佩服肖哥開闊的思維啊!

記錄下來,也分享給大家,然後繼續努力!

fighting!!!

leetcode 283 移動零,雙指標解法

題目描述 給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。public void movezeroes int nums 思路 ...

LeetCode第283題 移動零

給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0 1,0 3,12 輸出 1 3,12 0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。解法一 使用氣泡排序的方法將所有0移動到後面。emps 解法二 遍歷兩次陣列,第...

LeetCode回溯系列(1) 第17題解法

給定乙個僅包含數字 2 9 的字串,返回所有它能表示的字母組合。給出數字到字母的對映如下 與 按鍵相同 注意 1 不對應任何字母。示例 輸入 23 輸出 ad ae af bd be bf cd ce cf 給出如下回溯函式 backtrack combination,next digits 它將乙...