第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 它將乙...