問題文
配列所与 N ソートそれらは、赤、白または青色オブジェクト インプレース 同じ色のオブジェクトが隣接するように、白、青、赤の色で、順番に。
ここで、我々は、それぞれ色の赤、白、青を表すために整数0、1を使用し、2う。
注:この問題のためのライブラリのソート機能を使用すると仮定されていません。
例:
入力:[2,0,2,1,1,0]
出力:[0,0,1,1,2,2]
ファローアップ:
- むしろ単純溶液は、計数ソートを使用して2つのパス・アルゴリズムです。
まず、反復0、1'S、2'S、次いで0、1と2つの続いての総数と、その後上書きアレイのアレイカウント数。 - あなただけの一定のスペースを使用して1パスアルゴリズムを考え出すだろうか?
問題のリンク
ビデオチュートリアル
あなたはここに詳細なビデオチュートリアルを見つけることができます
思考プロセス
これは古典的であるオランダの国旗の問題。
一定のスペースを持つ2つのパスは、カウントの並べ替えと簡単です。(のことを思い出すソート基数拡張子がKの要素がある場合はどうなるかだろう何とか)(K> = 3)
1回のパスでそれを行う場合、そのアイデアは、ポインタとスワップを伴う必要があります。1場合、合格、左から右に起動します。0の場合、左へ移動。2場合は、右に移動
ソリューション
2パス
1 公共 ボイド sortColorsCountingSort(INT [] A){ 2 であれば(A == NULL || A.length == 0)のリターン; 3 4 INT []バケット= 新しい INT [3 ]。 5 6 用(INT I 0 =; I <A.lengthは、iが++ ){ 7つの バケット[A [I] + = 1 ; 8 } 9 10 int型のインデックス= 0 。 11 のために(INT I 0 =; I <3; I ++ ){ 12 のため(INT J = 0; J <バケット[I]; J ++ ){ 13 A [インデックス] = I。 14 インデックス++ ; 15 } 16 } 17 }
時間複雑:O(N)、Nはアレイのサイズであり、N + 3 * N = 4N = O(N)
空間複雑:O(1)この場合のみに3つの要素を必要とするので、まだ考え定数
ワンパス
1 公共 ボイド sortColors(INT [] A){ 2 であれば(A == NULL || A.length == 0)のリターン; 3 4 intが = 0を残しました。 5 int型の右= A.length - 1 。 6 7 INT iが0 = 。 8 一方、(I <=右){ //はバックスワップ場合CUR値がまだ評価する必要があるため、= <なければならない 9 た場合(A [I] == 1 ){ 10 ++ I 。 11 } それ以外 の場合(A [I] == 0 ){ 12 スワップ(A、I、左)。 13は ++左; 14 I ++; //はこれを忘れないでください、私たちはそうどんな前進しない、ここに戻って0または1を交換することができます 15 } 他 { // A [i]を== 2 16 スワップ(A、I、右)。 17 right-- ; 18 } 19 } 20 }
時間複雑:O(N)、Nはアレイのサイズであります
スペース複雑さ:O(1)