Lintcode 顏色排序2

2021-08-04 19:59:26 字數 1108 閱讀 6863

給定乙個有n個物件(包括k種不同的顏色,並按照1到k進行編號)的陣列,將物件進行分類使相同顏色的物件相鄰,並按照1,2,…k的順序進行排序。

注意事項

you are not suppose to use the library』s sort function for this problem.

k <= n

樣例給出colors=[3, 2, 2, 1, 4],k=4, 你的**應該在原地操作使得陣列變成[1, 2, 2, 3, 4]

挑戰乙個相當直接的解決方案是使用計數排序掃瞄2遍的演算法。這樣你會花費o(k)的額外空間。你否能在不使用額外空間的情況下完成?

標籤排序 兩根指標

思路首先想到的是陣列排序,但使用快排時,系統執行超時,所以採取別的方式。

若使用額外的空間,使用乙個大小為 k 的陣列記錄每個顏色出現的次數,然後重新寫入 colors 即可。

但題目要求不使用額外的陣列,所以可以直接使用 colors 統計顏色出現的頻率。具體如下(參考

由於顏色肯定是正數 1 到 k,所以我們可以用負數比如 colors [i] = -k,表示第 i 種顏色在原來的陣列裡面出現了 k 次。

首先f遍歷一遍原來的陣列,如果掃到 colors[i],首先檢查 colors[colors[i]] 是否為正數,如果是把 colors[colors[i]] 移動colors[i] 存放起來,然後把 colors[colors[i]] 記為-1(表示該位置是乙個計數器,計1)。 如果 colors[colors[i]] 是負數,那麼說明這乙個地方曾經已經計數了,那麼把 colors[colors[i]] 計數減一,並把color[i] 設定為0 (表示此處已經計算過),然後重複向下遍歷下乙個數,這樣遍歷原陣列所有的元素過後,陣列 colors[i] 裡面實際上儲存的每種顏色的計數,然後我們倒著再輸出每種顏色就可以得到我們排序後的陣列。

class solution

int index = 0;

while(index < size)

else

else }}

int i = size - 1;

while(k > 0)

k--;}}

};

LintCode 顏色分類

題目 給定乙個包含紅,白,藍且長度為 n 的陣列,將陣列元素進行分類使相同顏色的元素相鄰,並按照紅 白 藍的順序進行排序。我們可以使用整數 0,1 和 2 分別代表紅,白,藍。挑戰 乙個相當直接的解決方案是使用計數排序掃瞄2遍的演算法。首先,迭代陣列計算 0,1,2 出現的次數,然後依次用 0,1,...

lintcode練習 148 顏色分類

給定乙個包含紅,白,藍且長度為 n 的陣列,將陣列元素進行分類使相同顏色的元素相鄰,並按照紅 白 藍的順序進行排序。我們可以使用整數 0,1 和 2 分別代表紅,白,藍。不能使用 庫中的排序函式來解決這個問題。排序需要在原陣列中進行。您在真實的面試中是否遇到過這個題?是 給你陣列 1,0,1,2 需...

lintcode 148 顏色分類

給定乙個包含紅,白,藍且長度為 n 的陣列,將陣列元素進行分類使相同顏色的元素相鄰,並按照紅 白 藍的順序進行排序。我們可以使用整數 0,1 和 2 分別代表紅,白,藍。注意事項 不能使用 庫中的排序函式來解決這個問題。排序需要在原陣列中進行。樣例給你陣列 1,0,1,2 需要將該陣列原地排序為 0...