一魚多吃 用雙指針的觀念來解 Move Zeroes 搬移零 Leetcode #283

閱讀時間約 4 分鐘
raw-image

這題的題目在這裡

題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。同時必須保持原本數字的前後相對次序

比如說,移動之前,1 在 3前面,那麼移動之後,1還是必須保持在3前面。

(接著看下面的範例,會更好理解)


測試範例:

Example 1:

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
保持原本數字的前後相對次序

Example 2:

Input: nums = [0]
Output: [0]

約束條件:

Constraints:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

Follow up: Could you minimize the total number of operations done?


演算法:

其實和前面那題  Sort Array By Parity 九成像,前面那題是要求偶數的排在前面,奇數的排在後面

這題換湯不換藥,稍微小小改一下,題目要求 等於零的排在後面
等價於 把不等於0的排在前面

一般寫loop習慣大多是從左到右掃描,所以這題從 不等於0 切入,就會簡單很多

把不等於0的排在前面,當我們搬完之後,等於0的也會剛好排在後面。

註: 因為是位置交換,不等於0的往前挪了,一定會有一個等於0的往後挪。


程式碼:

class Solution:
 def moveZeroes(self, nums: List[int]) -> None:
  
  # swapping index for nonzero numbers
  idx_of_nonzero = 0

  is_nonzero = lambda x: x != 0

  # scan each element
  for i in range(len(nums)):
   
   if is_nonzero(nums[i]):

    # swap non-zero number to the left-hand side
    nums[ idx_of_nonzero ], nums[i] = nums[i], nums[ idx_of_nonzero ]
    idx_of_nonzero += 1
    
  return nums

時間複雜度:

O( n ) 一個單層的 for loop 迭代,掃描過每個數字一次。

空間複雜度:

O(1) 只用到固定一組雙指針double pointer,所占用的記憶體空間為常數級別O(1)


另解:

class Solution:
 def moveZeroes(self, nums: List[int]) -> None:

  zeroCount = 0

  for i in range( len(nums) ):

   # 統計0的出現次數
   if nums[i] == 0:
    zeroCount += 1
   
   # 把 非0的數字搬到前面,並且保持原本的前後次序​
   elif zeroCount > 0:
    nums[i-zeroCount], nums[i] = nums[i], nums[i-zeroCount]

  return

時間複雜度:

O( n ) 一個單層的 for loop 迭代,掃描過每個數字一次。

空間複雜度:

O(1) 只用到固定的臨時變數 和 計數器,所占用的記憶體空間為常數級別O(1)


學完這題之後,記得回去複習原本的那一題 Sort Array by Parity,背後的核心觀念,都是數字先分類成兩群(奇數 偶數、等於零 不等於零),再做移動的操作。


Reference:

[1] Python O(n) by element swap [w/ Comment] - Move Zeroes - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
關於一主多奴-奴寵篇關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
avatar
可燃冰
2023-05-29
關於一主多奴-主人篇關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
avatar
可燃冰
2023-05-29
一個人的成功不在於有多【聰明】而在於更能【熬】 很多的時候,大家都會認為一些成功者,都是很聰明的。【其實不然】。 阿里巴巴的創辦人馬雲,算是一位特別傳奇人物。 其中馬雲高中畢業,參加第一次高考(大學入學考試),大家應該不敢相信其中數學考了1分。
Thumbnail
avatar
Pedor Chang
2023-04-23
股票可以一魚多吃?股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
avatar
茉園生活隨筆
2022-12-20
【致親愛的你 系列】多留一點餘裕給自己和生活,這樣的人生才叫活過。說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯
Thumbnail
avatar
陳然冉
2022-05-01
[台北旅遊]東明公園一座位於南港區重多機關要塞、台灣藍鵲賞鳥眾多場地精粹、社區小型森林之南港區特色公園台北市南港區東明公園相關資訊:: 地址: 台北市南港區南港路二段86巷8弄 (東明社會國宅旁邊) 電話: 02 2585 0192 (管理單位:台北市政府公園路燈工程管理處圓山管理所) 開放時間: 開放空間 (無時間限制) 備註: 公園 東明公園此地佔據在南港區眾多場地精粹之地 ​
Thumbnail
avatar
bravejim
2021-12-27
黃豆玉米多空懸於一線| 原物料觀察日記 美國農業部將於10/12公佈供需報告,從產量、期末庫存到單產,幾項重要指標皆普遍被預期會較前次調高。 產量:從4374百萬英斗上調至4415百萬英斗(區間4374- 4466百萬英斗) 期末庫存:從1850百萬英斗上調至3000百萬英斗(區間1610- 3730百萬英斗)
Thumbnail
avatar
諸葛呆的耕讀筆記- 外匯、經濟、黃小玉
2021-10-11
114號記錄:考思辨 你看得出論文原稿一魚多吃的問題嗎?童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
avatar
台灣星火
2021-09-30
113號記錄:消失的一魚多吃期刊蔡英文的國圖版論文公佈之後,除了抄襲爭議外的另一個質疑,就是童文薰律師揭露的一魚多吃。而其中有趣的一則花絮就是...
Thumbnail
avatar
台灣星火
2021-09-30
關於【留長髮的男生】試圖多一點理解女性經驗這種事從留長髮這件事,本宅慢慢發現何謂「男性凝視」,那些因為留長髮自然而然產生的動作,搖身一變成為「性感的象徵」。還給那些自然而然的動作該有的意義,是離開父權社會和男性凝視的一種方法,而縱使性別有無法跨越的鴻溝,我們依然能透過「確認自己不可能擁有的經驗」而畫出我們行使謙卑的範圍。
Thumbnail
avatar
牢騷肥宅
2021-02-08