LeetCode 筆記 - 75. Sort Colors
題目在此 75. Sort Colors
給定一個只包含 0
、1
和 2
的陣列,請將陣列中的元素原地排序,使得相同的元素相鄰,且按照 0
、1
、2
的順序排列。你必須在不使用內建排序函式的情況下完成此任務。
解題思維
因為這題的數值只有 0
、1
和 2
,所以千萬不要跳下去實作排序,這樣會浪費很多時間。
在這裡有個 $O(n)$ 的解法,稱為「荷蘭國旗問題」(Dutch National Flag Problem),這個方法使用三個指標來分別追蹤 0
、1
和 2
的位置。
我們使用 left
、mid
和 right
。初始時,left
和 mid
指向陣列的起始位置,right
指向陣列的末尾位置。
- 當
nums[mid] == 0
時,將nums[mid]
與nums[left]
交換,然後將left
和mid
向右移動一位。 - 當
nums[mid] == 2
時,將nums[mid]
與nums[right]
交換,然後將right
向左移動一位(注意這時候mid
不動,因為交換過來的數字還沒檢查過)。 - 當
nums[mid] == 1
時,直接將mid
向右移動一位。
根據第二點,在 交換 nums[mid]
和 nums[right]
時,因為我們不知道從 nums[right]
交換過來的數字是什麼,所以我們不移動 mid
指標,這樣可以確保我們會再次檢查這個位置的數字,避免漏掉任何需要處理的數字。
所以終止條件會是 mid
超過 right
。
程式碼
1 | class Solution: |