タイトルの説明
これでn個のオブジェクトの配列があり、オブジェクトの色は赤、白、または青です。同じ色のオブジェクトが隣接し、色の順序が赤、白、青になるように配列を並べ替えてください。
赤、白、青をそれぞれ表すために0、1、2を使用します。
注:
この質問では、ソートライブラリ関数を使用できないことを要求します。
拡張機能:
非常に簡単な解決策は、2ステップカウントソートアルゴリズムです。
最初:配列を反復して、0、1を記録します、2の数。次に配列を書き換え、最初に0を書き込み、次に1を書き込み、次に2を書き込み
ます。一定の空間複雑度でこの問題を解決できるワンステップアルゴリズムを提供できます。そうですか?
分析
- 簡単に言えば、0,1,2の配列は、インプレースアルゴリズムによって並べ替えられます。
- 左と右のポインターをそれぞれ設定します。左側はすべて0で、左は左から最初の非ゼロ要素を指し、右は右を指し、最初の非2要素を指します。
- 左カーブは0と後者1であることが保証されています。
- Curは左から右に移動し、1と出会うとジャンプします。2と出会うと、右の要素と交換されます。右の要素は0または1です。このとき、rightは2に置き換えられますright–; 0に出会うと左要素の交換では、curの左側は0または1だけなので、leftが指す要素は1でなければなりません。この交換後、leftが指す要素は0になり、左を右に移動できます。このとき、curの要素は1なので、右に移動する必要があります。
Javaコード
public class Solution {
public void sortColors(int[] A) {
if(A == null || A.length <= 1){
return;
}
//本质就是0 1 2元素的数组排序
//left 从左向右 指向第一个非0元素
int left = 0;
while(left < A.length && A[left] == 0){
left++;
}
//right 从右向左 指向第一个非2 元素
int right = A.length-1;
while(right > 0 && A[right] == 2){
right--;
}
int cur = left;
while(cur <= right){
if(A[cur] == 1){
cur++;
}else if(A[cur] == 0){
swap(A,cur,left);
left++;
cur++;
}else{
swap(A,cur,right);
right--;
}
}
}
public void swap(int [] A, int i ,int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}