題目描述:
給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用**庫中的排序函式來解決這道題。
示例:
輸入:[2,0,2,1,1,0]輸出:[0,0,1,1,2,2]高階:看到題目我首先想到的就是排序,所以
第一種思路就是用排序來做,我是用氣泡排序來做,時間複雜度高o(n^2),快速排序目前還模稜兩可,後面更新用快速排序做的方法。
第二種思路就是取巧,題目要求,有三種顏色,0,1,2,那麼我們可以將0找到放到陣列前面,將二找到放到陣列後面,至於1,0,2放好之後,1自然就是放好的。這種時間複雜度很低o(n)
第三種思路就是統計這0,1,2出現的次數,然後挨個(按照順序)賦值個那個原陣列,這種方法時間複雜度o(n),但掃瞄兩邊陣列,速度比第二中思路慢一點,但比第一種快。
具體看**:
第一種思路:
public void sortcolors(int nums) }}
public static void main(string args);
顏色分類 yanse = new 顏色分類 ();
yanse.sortcolors ( a );
}
執行結果:
執行用時:
第二種方法,因為只有0,1,2所以,讓0去前面,讓2去後面,1不用管,然後0都到前面了,2都到後面了,1自然就在中間了
// 定義首部(為0時的下標)
int k = -1;
// 用於交換的中間變數
int t;
// 定義尾部(為2時的下標)
int n = nums.length;
// 這個地方i必須小於n,因為n隨著遍歷會逐漸遞減,當前面是00,後面是22時,如果i《陣列長度,然後又會將排好的2重新和中間11比較,又會打亂順序,隨意,這個i要小於這個變化n,當前面是00,後面是22時,陣列停止遍歷,退出。(也就是i《最後乙個1的下標時結束for)。
for (int i = 0;i執行用時:
第三種思路:
// 第三種方法
int a=0;
int b=0;
int c=0;
for (int i=0;i執行用時:
總結:這道題其實最好的方法就是排序,但也有取巧的方法,但我就會兩三種,還得慢慢學,後面會不斷更新。
2018-2-27
leetcode 顏色分類
75顏色分類 給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0...
LeetCode 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
LeetCode 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...