Leetcode液75ソートの色

問題文 

配列所与  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)

リファレンス

おすすめ

転載: www.cnblogs.com/baozitraining/p/12501620.html