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!
評論