給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:不能使用**庫中的排序函式來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
高階:
* 乙個直觀的解決方案是使用計數排序的兩趟掃瞄演算法。
首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。
* 你能想出乙個僅使用常數空間的一趟掃瞄演算法嗎?
原題url:
我當時想到的第一種想法就是排序,後來感覺沒有必要,因為只有3種元素,我完全就可以按照高階
提示中的第一條,先掃瞄統計出各元素個數,然後第二遍掃瞄時,直接進行賦值。
讓我們直接來看**:
class solution
}// 重新賦值
for (int i = 0; i < nums.length; i++) else if (i < num0 + num1) else }}
}
提交ok,執行用時:0 ms
,記憶體消耗:35.2 mb
。是否還可以優化呢?
參考高階
提示中的第二條,上面的方法使用了常數空間,但一遍掃瞄該如何做到呢?
具體來說,就是增加乙個當前指標current
(從下標0開始)、乙個指向數字0區間的末尾指標p0
(從下標0開始)、乙個指向數字2區間的開始指標p2
(從下標 nums.length - 1)。下標0 到下標 p0 之間存放數字0,下標 p0 到 p2 之間存放數字1,下標 p2 到 下標 (nums.length - 1) 之間存放數字2。current 指標從下標0開始遍歷,如果值為0,則和 p0 交換,如果值為2,則和 p2 交換。
讓我們來看看**:
class solution
// 如果當前值為0,則和 p0 交換,p0指標往後移動
if (nums[current] == 0)
p0++;
continue;
}// 如果當前值為2,則和 p2 交換,p2指標往前移動
if (nums[current] == 2) }}
}
提交ok,執行用時:0 ms
,記憶體消耗:35 mb
。這結果,感覺好像沒有多少優化,但對於我們而言,最重要的是增加了一種解題思路。
以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題主要在於利用指標
一遍掃瞄得出結果,優化解題。
力扣75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...
75 顏色分類
給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...