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: |