物歸原位 顏色排序 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

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
題目敘述 Combination Sum IV 給定一個輸入陣列nums,和目標值target,從nums裡面挑數字去湊出總和 = target,數字可以重複挑選。 請問有多少排列數可以湊出target? 註: 排列數的意思就是位置不同代表兩種不同的方法數。
題目敘述 House Robber III 題目會給我們一個二元樹, 二元樹裡的每個節點分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是上下相鄰樓層的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問盜賊可以得手的最大金額是多少?
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
題目敘述 Minimum Cost For Tickets 題目會給定兩個陣列。 第一個是日期陣列days,代表外出旅遊的是哪幾天。 第二個是成本陣列costs,代表火車一日票、七日票、30日的月票的票價。 請問火車旅行支出的最小費用是多少?
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
題目敘述 Combination Sum IV 給定一個輸入陣列nums,和目標值target,從nums裡面挑數字去湊出總和 = target,數字可以重複挑選。 請問有多少排列數可以湊出target? 註: 排列數的意思就是位置不同代表兩種不同的方法數。
題目敘述 House Robber III 題目會給我們一個二元樹, 二元樹裡的每個節點分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是上下相鄰樓層的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問盜賊可以得手的最大金額是多少?
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
題目敘述 Minimum Cost For Tickets 題目會給定兩個陣列。 第一個是日期陣列days,代表外出旅遊的是哪幾天。 第二個是成本陣列costs,代表火車一日票、七日票、30日的月票的票價。 請問火車旅行支出的最小費用是多少?
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
好習慣養成自然。
  一切都始於她發現了那只手套。 它就這樣被遺忘在公車座位上。 「我找到這個。」 夏洛特在下車時把它遞給司機。 「太好了,」他說,手指敲打著方向盤。 「有人可能會來你們的失物招領處找。」 「留著吧,美女。我們失物招領處值得索賠的東西都會被其他司機偷走。」 他瞥了一眼右肩,駛出交通流。
Thumbnail
10月有個晚上,我從公共圖書館散步回家。一邊端著喝了一下午的咖啡,一邊搜尋垃圾桶,想把它丟掉。圖書館出門走不到20米,便遇到第一個垃圾桶。這個垃圾桶的垃圾已經滿的快溢出,所以扔不進去。 繼續往前走,途徑第二個垃圾桶。這個垃圾桶依舊是滿的,但幸好不至於要溢出來,所以我果斷扔了進去。 白天時
Thumbnail
身為小資族、打工人 開源管道不多,收入有限 即便如此 想要FIRE的想法一直都存在 摸索 研究 嘗試 規劃 失敗 挫折 檢討 能做到怎樣的程度 成功、失敗 無法預測 開始記錄 生活開支 節流開始 到 開源探索 願大家都能早日FIRE 而我先從微FIRE開始邁進 8月份薪資分
Thumbnail
我時常在想,什麼才是財務自由 ? 妳可以靜下來,花一分鐘的時間,想一下心目中的 「 財務自由」是什麼 ? 1.一直有錢花 ? 花不完的錢 ? 2.不用工作,每天自由自在的過自己想過的生活 ? 3.被動收入超過生活開支,不再為錢煩惱 ? 我自己很簡單,就是被動收入超過我的生活開銷,可以不用擔心生活上錢
Thumbnail
本期重點: • 為什麼會經營自媒體 • 透過自媒體該如何獲利 • 經營上有遇過什麼困難 • 目前轉換到什麼賽道 • 財務規劃師在做些什麼 • 對自己未來的規劃是如何
Thumbnail
個人家庭理財找財務規劃顧問,一般人可能還蠻陌生的,不過一個好的財務顧問對你的幫助其實蠻大的。 但是財務規劃的步驟到底是怎麼做的? 財務顧問如何進行財務規劃諮詢? 這影片提供給你參考。 預約免費財務
Thumbnail
天啊~ 我在家會尖叫有2個原因,大蟑螂和體重創新高。原來對我而言,創新高的體重和大蟑螂是一樣可怕的事。 其實每半年的追蹤醫生都跟我提醒:「廖小姐,你脂肪肝...」 心理的OS:「我也有控制飲食少吃一點,體重不降我又有什麼方法呢?」 認識我許久的朋友客戶,看著我的衣服由S升級為M,再升級為L
Thumbnail
說到家庭教育, 就不由得想起之前的一段記憶. 之所以記得, 因為那家人的對話太經典. 哇!! 那位媽媽一次指責了好多人, 婆婆, 老公, 還有兒子. 狠角色. 我彷彿感受得到, 他們家的東西, 應該都是會物歸原處的.
Thumbnail
文、圖/電通安吉斯集團提供   全台最具規模的行銷傳播集團電通安吉斯(Dentsu Aegis Network Taiwan)為提供客戶更具創意、創新的多元整合服務,宣佈攜手七十六号原子(Studio 76)以及台灣大哥大myVideo,共同投資劇集「違反校規的跳投」。此舉除了展現電通安吉斯集
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
好習慣養成自然。
  一切都始於她發現了那只手套。 它就這樣被遺忘在公車座位上。 「我找到這個。」 夏洛特在下車時把它遞給司機。 「太好了,」他說,手指敲打著方向盤。 「有人可能會來你們的失物招領處找。」 「留著吧,美女。我們失物招領處值得索賠的東西都會被其他司機偷走。」 他瞥了一眼右肩,駛出交通流。
Thumbnail
10月有個晚上,我從公共圖書館散步回家。一邊端著喝了一下午的咖啡,一邊搜尋垃圾桶,想把它丟掉。圖書館出門走不到20米,便遇到第一個垃圾桶。這個垃圾桶的垃圾已經滿的快溢出,所以扔不進去。 繼續往前走,途徑第二個垃圾桶。這個垃圾桶依舊是滿的,但幸好不至於要溢出來,所以我果斷扔了進去。 白天時
Thumbnail
身為小資族、打工人 開源管道不多,收入有限 即便如此 想要FIRE的想法一直都存在 摸索 研究 嘗試 規劃 失敗 挫折 檢討 能做到怎樣的程度 成功、失敗 無法預測 開始記錄 生活開支 節流開始 到 開源探索 願大家都能早日FIRE 而我先從微FIRE開始邁進 8月份薪資分
Thumbnail
我時常在想,什麼才是財務自由 ? 妳可以靜下來,花一分鐘的時間,想一下心目中的 「 財務自由」是什麼 ? 1.一直有錢花 ? 花不完的錢 ? 2.不用工作,每天自由自在的過自己想過的生活 ? 3.被動收入超過生活開支,不再為錢煩惱 ? 我自己很簡單,就是被動收入超過我的生活開銷,可以不用擔心生活上錢
Thumbnail
本期重點: • 為什麼會經營自媒體 • 透過自媒體該如何獲利 • 經營上有遇過什麼困難 • 目前轉換到什麼賽道 • 財務規劃師在做些什麼 • 對自己未來的規劃是如何
Thumbnail
個人家庭理財找財務規劃顧問,一般人可能還蠻陌生的,不過一個好的財務顧問對你的幫助其實蠻大的。 但是財務規劃的步驟到底是怎麼做的? 財務顧問如何進行財務規劃諮詢? 這影片提供給你參考。 預約免費財務
Thumbnail
天啊~ 我在家會尖叫有2個原因,大蟑螂和體重創新高。原來對我而言,創新高的體重和大蟑螂是一樣可怕的事。 其實每半年的追蹤醫生都跟我提醒:「廖小姐,你脂肪肝...」 心理的OS:「我也有控制飲食少吃一點,體重不降我又有什麼方法呢?」 認識我許久的朋友客戶,看著我的衣服由S升級為M,再升級為L
Thumbnail
說到家庭教育, 就不由得想起之前的一段記憶. 之所以記得, 因為那家人的對話太經典. 哇!! 那位媽媽一次指責了好多人, 婆婆, 老公, 還有兒子. 狠角色. 我彷彿感受得到, 他們家的東西, 應該都是會物歸原處的.
Thumbnail
文、圖/電通安吉斯集團提供   全台最具規模的行銷傳播集團電通安吉斯(Dentsu Aegis Network Taiwan)為提供客戶更具創意、創新的多元整合服務,宣佈攜手七十六号原子(Studio 76)以及台灣大哥大myVideo,共同投資劇集「違反校規的跳投」。此舉除了展現電通安吉斯集