有三種顏色,編號為 0, 1, 2。給一個陣列包含三種顏色,要在 in-place 去由小至大排序過。
Note:不要使用內建的 sort() function。
題目給了兩種方向,先 Count 後排序,二是跑一遍就完成。方向一太簡單,數完各顏色再從頭依種類、數量做替換。
二被限制只能用常數空間,換句話說,只能記沒有長度的數值。
答案一定是 0 都在陣列的最左方, 2 都在陣列的最右方。如果 pass 一遍,遇 0 往左擺,遇 2 往右擺,這樣就能快速分類。
左方擺過 0 的位置就不再使用,同理右方擺過 2 的,如果重複用到,就會破壞已經排好的序列。
因此採用 「Two Pointer」 ,而 Two Pointer 也是一個 O(1) Space 的方法。
pass 過程遇到 0 或 2 都會使左界或右界縮窄,可以想成把答案夾出來。
class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ l, m, r = 0, 0, len(nums)-1 while m <= r: if nums[m] == 0: nums[l], nums[m] = nums[m], nums[l] l += 1 m += 1 elif nums[m] == 2: nums[r], nums[m] = nums[m], nums[r] r -= 1 else: m += 1C#
public class Solution { public void SortColors(int[] nums) { int l = 0; int m = 0; int r = nums.Length-1; int tem = -1; while(m <= r) { if(nums[m] == 0) { tem = nums[l]; nums[l] = 0; nums[m] = tem; l += 1; m += 1; } else if(nums[m] == 2) { tem = nums[r]; nums[r] = 2; nums[m] = tem; r -= 1; }else { m += 1; } } } }