物歸原位 顏色排序 Sort Colors _Leetcode #75 雙指針應用

閱讀時間約 4 分鐘

題目敘述 Sort Colors

給定一個色彩陣列,裡面的顏色包含0紅色,1白色,2藍色。

要求我們透過in-place操作,把色彩陣列依序從左到右排好,
依序出現的是紅色、白色、藍色


題目限制不可以使用內建的sort function。


測試範例

Example 1:

Input: nums = [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Example 2:

Input: nums = [2,0,1]
Output: [0,1,2]

約束條件

Constraints:

  • n == nums.length

n 代表輸入陣列的長度。

  • 1 <= n <= 300

n介於1~300之間。

  • nums[i] is either 01, or 2.

 每個陣列元素的值只有三種可能: 0(紅色), 1(白色), 2(藍色)

.

進階提問

Follow up: Could you come up with a one-pass algorithm using only constant extra space?

能不能想出一次線性掃描,並且只使用常數空間的演算法?


演算法 雙指針 + swap操作

總共只有三個顏色。

根據題意,紅色必須放在左邊那個區域,白色置中,藍色放在右邊那個區域

可以用雙指針,分別指向頭部(放置紅色的目標區域)和尾部(放置藍色的目標區域)。


遇到紅色就把它放到頭部靠左邊的位置,透過置換元素操作in-place完成。

遇到藍色就把它放到尾巴靠右邊的位置,透過置換元素操作in-place完成。

(實作上的細節是,藍色和尾巴元素交換後,必須多檢查一次,確保間換過來的顏色也是放在正確的區域)


最後留在中間,自然就是的白色。


程式碼 雙指針 + swap操作

class Solution:

def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# constant for colors
RED, WHITE, BLUE = 0, 1, 2

# two pointers for RED as well as BLUE
idx_red, idx_blue = 0, len(nums)-1

i = 0
while i <= idx_blue :

if nums[i] == RED:

nums[idx_red], nums[i] = nums[i], nums[idx_red]

# update idx for red
idx_red += 1

elif nums[i] == BLUE:

nums[idx_blue], nums[i] = nums[i], nums[idx_blue]

# update idx for blue
idx_blue -= 1

# i-1 in order to stay and do one more color check on next iteration
i -= 1

# i move forward
i += 1

複雜度分析

時間複雜度: O(n)

從左到右一次線性掃描,每個元素檢查一次,放置到對應的顏色區域。


空間複雜度: O(1)

使用到的都是固定此吋的臨時變數,為常數級別O(1)。


關鍵知識點 指針 + in-place搬移元素的技巧

這題用到的是in-place搬移元素的技巧,

和之前學過的Move Zeros很像,都是鑲在目標區域建立指針,
接著掃描每個元素,把每個元素搬到對應的區域。


Reference

[1] Sort Colors - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
物歸原處好習慣養成自然。
Thumbnail
avatar
郭于禎
2023-12-29
物歸原主   一切都始於她發現了那只手套。 它就這樣被遺忘在公車座位上。 「我找到這個。」 夏洛特在下車時把它遞給司機。 「太好了,」他說,手指敲打著方向盤。 「有人可能會來你們的失物招領處找。」 「留著吧,美女。我們失物招領處值得索賠的東西都會被其他司機偷走。」 他瞥了一眼右肩,駛出交通流。
avatar
沒有了我之後
2023-11-14
傾倒垃圾和物歸原位,是一封要你檢視內心髒污的「情書」10月有個晚上,我從公共圖書館散步回家。一邊端著喝了一下午的咖啡,一邊搜尋垃圾桶,想把它丟掉。圖書館出門走不到20米,便遇到第一個垃圾桶。這個垃圾桶的垃圾已經滿的快溢出,所以扔不進去。 繼續往前走,途徑第二個垃圾桶。這個垃圾桶依舊是滿的,但幸好不至於要溢出來,所以我果斷扔了進去。 白天時
Thumbnail
avatar
Flore Weng 翁嗡
2023-11-04
[財務規劃]薪資分配-23/08身為小資族、打工人 開源管道不多,收入有限 即便如此 想要FIRE的想法一直都存在 摸索 研究 嘗試 規劃 失敗 挫折 檢討 能做到怎樣的程度 成功、失敗 無法預測 開始記錄 生活開支 節流開始 到 開源探索 願大家都能早日FIRE 而我先從微FIRE開始邁進 8月份薪資分
Thumbnail
avatar
Ning
2023-07-28
【財務規劃的重要性】實現財務自由的道路?我時常在想,什麼才是財務自由 ? 妳可以靜下來,花一分鐘的時間,想一下心目中的 「 財務自由」是什麼 ? 1.一直有錢花 ? 花不完的錢 ? 2.不用工作,每天自由自在的過自己想過的生活 ? 3.被動收入超過生活開支,不再為錢煩惱 ? 我自己很簡單,就是被動收入超過我的生活開銷,可以不用擔心生活上錢
Thumbnail
avatar
梵希朵
2023-06-29
EP12行行有狀元|從自媒體部落客成長的財務規劃師|feat. 原味覺醒moni本期重點: • 為什麼會經營自媒體 • 透過自媒體該如何獲利 • 經營上有遇過什麼困難 • 目前轉換到什麼賽道 • 財務規劃師在做些什麼 • 對自己未來的規劃是如何
Thumbnail
avatar
陳執董的商業洞察
2023-01-16
財務規劃是如何做的?個人家庭理財找財務規劃顧問,一般人可能還蠻陌生的,不過一個好的財務顧問對你的幫助其實蠻大的。 但是財務規劃的步驟到底是怎麼做的? 財務顧問如何進行財務規劃諮詢? 這影片提供給你參考。 預約免費財務
Thumbnail
avatar
Taylor Liao
2022-10-03
財務規劃創造美好人生-- 健康、財務双豐收天啊~ 我在家會尖叫有2個原因,大蟑螂和體重創新高。原來對我而言,創新高的體重和大蟑螂是一樣可怕的事。 其實每半年的追蹤醫生都跟我提醒:「廖小姐,你脂肪肝...」 心理的OS:「我也有控制飲食少吃一點,體重不降我又有什麼方法呢?」 認識我許久的朋友客戶,看著我的衣服由S升級為M,再升級為L
Thumbnail
avatar
廖嘉紅
2022-10-03
物歸原處, 有很難嗎?!說到家庭教育, 就不由得想起之前的一段記憶. 之所以記得, 因為那家人的對話太經典. 哇!! 那位媽媽一次指責了好多人, 婆婆, 老公, 還有兒子. 狠角色. 我彷彿感受得到, 他們家的東西, 應該都是會物歸原處的.
Thumbnail
avatar
AM 2
2022-01-06
電通安吉斯集團宣佈跨足影視業務 攜手七十六号原子投資劇集「違反校規的跳投」文、圖/電通安吉斯集團提供   全台最具規模的行銷傳播集團電通安吉斯(Dentsu Aegis Network Taiwan)為提供客戶更具創意、創新的多元整合服務,宣佈攜手七十六号原子(Studio 76)以及台灣大哥大myVideo,共同投資劇集「違反校規的跳投」。此舉除了展現電通安吉斯集
Thumbnail
avatar
廣告雜誌
2019-11-05