75. Sort Colors
題目網址:https://leetcode.cn/problems/sort-colors/
題意:給一包含紅色、白色和藍色, 總共
n個元素的 arraynums, 原地對nums進行排序, 使得相同顏色的元素相鄰, 並按照紅、白、藍的順序排列。分別使用
0、1、2代表紅、白、藍。注意:不能使用 library 中的 sort 函式。
進階:設計 $O(1)$ space 的一次掃描演算法。

Solution 1:
想法:第一次掃描先計算
0、1、2的個數, 第二次掃描則按照個數填充nums
class Solution { |
- time:$O(n)$ ➔ $O(2n)$, 因為有
2次掃描 - space:$O(1)$ ➔ 撇除要返回的
res, 只需常數空間
Solution 2:
想法:利用 Two Pointers + Partition, 用 ptr
i來遍歷nums, 定義並維護以下三個區間:
[0, left - 1]皆為0:所有在left以左的元素皆為0[left, i - 1]皆為1:left ~ i - 1之間的元素皆為1[right + 1, n - 1]皆為2:所有在right以右的元素皆為2特殊情況:當
nums[i] == 2,nums[i]要和nums[right]做swap(), 但我們不知道swap()前原本nums[right]的元素是什麼, 因此swap()後不能直接將i往下一位移動, 而是應該在下一輪繼續判斷nums[i]
swap()前:
swap()後:假設原先nums[right]為0, 則 swap 後nums[i] = 0, 若此時將i往下一位移動, 則那個 swap 的0不會被擺在正確的位置上
為什麼
nums[i] == 0不是特殊情況:因為我們維護區間[left, i - 1]皆為1, 也就是說nums[left]會指著1, 和nums[left]做swap()後nums[i]變成1,i + 1後在下一輪中仍滿足[left, i - 1], 因此可以直接往後一位
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論

