Leetcode刷題筆記 75Sort Color

2022-07-18 13:51:18 字數 2062 閱讀 8820

一、問題

給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:不能使用**庫中的排序函式來解決這道題。

示例:輸入: [2,0,2,1,1,0]

輸出: [0,0,1,1,2,2]

二、解決

思路一:計數排序:掃瞄一遍陣列統計 0 1 2 三個元素的個數,然後再依次放回陣列。適用於元素個數有限的情況下。

**:

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 };

時間複雜度o(n)   空間複雜度為o(k) k=3因為k為常數所以為o(1)。

思路二:三路快速排序,選取乙個切分點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...