給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
高階:你可以不使用**庫中的排序函式來解決這道題嗎?
你能想出乙個僅使用常數空間的一趟掃瞄演算法嗎?
示例 1:
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]
本題主要要求實現乙個時間複雜度為o(n
)o(n)
o(n)
, 空間複雜度為o(1
)o(1)
o(1)
的演算法。
方法1統計每乙個數字所出現的次數,並且儲存起來,然後遍歷這個次數陣列,並按照陣列的次數在原來的陣列中進行儲存數字。
class
solution
;// 本質是計數排序,時間複雜度為o(n)
for(
int it: nums) count[it]++;
for(
int i=
0, index=
0;i<
3;i++
)for
(int j=
0;j;j++
) nums[index++
]=i;}}
;
時間複雜度為o(k
∗n
)o(k*n)
o(k∗n)
, 空間複雜度為o(k
)o(k)
o(k)
, 其中k為常數,所以時間複雜度為o(n
)o(n)
o(n)
, 空間複雜度為o(1
)o(1)
o(1)
。方法2
上面的解法其實是掃瞄原來的陣列兩遍,在相同的時空複雜度下,我們可以只掃瞄一遍即可解出本題。考慮使用雙指標的方式,即由於顏色總共是有三種,那麼定義兩個指標,p指標指向當前已經排好序的紅顏色的下乙個位置,q指標指向當前已經排好序的藍顏色的前乙個位置,然後進行一次遍歷進行歸位,最終當紅顏色和藍顏色都排好序之後,白顏色也就自動排好序了。其基本的演算法思想其實和調整陣列順序使奇數字於偶數前面思想一致。
class
solution
else
if(nums[i]==2
)else i++;}
}};
leetcode 75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
leetcode75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
leetcode75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...