力扣75 顏色分類

2022-03-26 11:17:25 字數 1593 閱讀 4188

給定乙個包含紅色、白色和藍色,一共 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,...