一、問題
給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:不能使用**庫中的排序函式來解決這道題。
示例:輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
二、解決
思路一:計數排序:掃瞄一遍陣列統計 0 1 2 三個元素的個數,然後再依次放回陣列。適用於元素個數有限的情況下。
**:
1時間複雜度o(n) 空間複雜度為o(k) k=3因為k為常數所以為o(1)。class
solution ; //
宣告個陣列用於存放0 1 2三個元素的頻率
5for(int i=0;i)
10//
for迴圈結束後 count陣列各索引值為0 1 2三個元素在nums陣列中的個數。
1112
int index=0;13
//先放0這個元素,0共有count[0]個所以迴圈count[0]次
14for(int i=0;i0];i++)
15 nums[index++]=0; //
將index索引依次放置為0。
16for(int i=0;i1];i++)
17 nums[index++]=1;18
for(int i=0;i2];i++)
19 nums[index++]=2;20
}21 };
思路二:三路快速排序,選取乙個切分點v(有的書翻譯為樞紐元),則排好序後整個陣列分為小於v;等於v;大於v三段。
設定三個索引:zero和two 以及移動索引i。索引位置如下圖
當 i 遍歷到e這個元素時
如果e=1,則將e併入1中,然後i後移一位即可。
如果e=2,則將two索引前面的元素(two索引前面的元素值未知)與e交換位置,此時i不動,然後two向前移動一位即可。
如果e=1,則將e元素與zero索引後的元素交換位置(zero索引後的元素一定為1),所以交換後i向後移一位,zero也向後移一位。
最終排序完成如下圖
**參考:
LeetCode刷題 (75) 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
leetcode刷題 75顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
leetcode刷題之 75 顏色分類
class solution def sortcolors self,nums list int none do not return anything,modify nums in place instead.a nums.count 0 b nums.count 1 c nums.count 2...