LeetCode 🟡 75. Sort Colors
🔗 🟡 75. Sort Colors
tags: 陣列(Array)
排序(Sorting)
雙指針(Two Pointers)
題意
給定一個長度為 的陣列 ,分別代表 個物品,這些物品顏色分別為紅色、白色或藍色,請 原地 對它們進行排序,使得相同顏色的物品相鄰,且按照紅色、白色和藍色的順序排列。
我們用整數 、 和 來分別代表紅色、白色和藍色。
你必須在不使用 library 的排序函數的情況下解決這個問題。
後續問題(Follow-up)
- 你能想出一個只使用常數額外空間的單次掃描演算法嗎?
思路:雙指針(Two Pointers)
首先確定核心思路,由於只有三個數字,因此當我們將 放到前面、 放到後面後,剩下的 自然而然地會留在中間。
因此可以使用 雙指針(Two Pointers) 來解決這個問題。分別令 l
和 r
指向下一個 和 的位置,並初始化一個指針 idx
用來遍歷陣列。以此確保在遍歷的過程中, 的位置皆為 , 的位置皆為 。
接著根據 nums[idx]
的值,判斷是否需要將 nums[idx]
放到 l
或 r
中,以及將 idx
向右移動。
- 若
nums[idx]
為 ,則將nums[l]
和nums[idx]
交換,並將l
和idx
向右移動。 - 若
nums[idx]
為 ,則將nums[r]
和nums[idx]
交換,並將r
向左移動。這裡需要注意的是,由於交換後idx
指向的新數字有可能還是 ,因此idx
不應移動。 - 若
nums[idx]
為 ,則將idx
直接向右移動即可。
由於 的位置皆為 ,因此終止條件為 idx > r
。
當遍歷整個陣列後,所有的 會被移到左邊, 被移到右邊,因此剩下的 自然會留在中間,達到排序的目的。這個思路與 3-Way QuickSort
相同。
複雜度分析
- 時間複雜度: ,其中 是陣列的長度。
- 空間複雜度: 。
1 | class Solution: |
1 | class Solution { |
參考資料
寫在最後
masterpiece, best quality, high quality, extremely detailed CG unity 8k wallpaper, extremely detailed, High Detail, vibrant, colors, backlight, bright, soft lighting, dreamy atmosphere, orange tone, (1girl, solo), long hair, looking at viewer, gentle smile, bangs, black hair, brown eyes, standing, sleeveless, indoors, blunt bangs, bag, sleeveless dress, handbag, dress, (orange dress), in the library, library, bookshelves, warm light filtering through windows, cozy ambiance, soft shadows, detailed background, vintage decor, scattered books, wooden furniture