タイトル
、赤、白、青、合計n個の配列の要素、in situでそれらをソートし、同じ色を持つように隣接する素子と、赤、白、青の順に配置所与。
この問題は、我々は、赤、白、青を表す0、1、2の整数を使用します。
注:
あなたがこの質問を解決するためのソート機能のコードベースを使用することはできません。
例:
入力:[2,0,2,1,1,0]
出力:[0,0,1,1,2,2]
アドバンス:
直感的なソリューションは、注文を用いたアルゴリズム二回のスキャンを数えることです。
まず、要素0、1、2、及びその後の数の反復計算は、現在のアレイを上書き、0,1,2ソート。
あなただけの一定のスペースアルゴリズムを使用しない単一のパスを考えることができますか?
出典:滞在ボタン(LeetCode)
:リンクhttps://leetcode-cn.com/problems/sort-colors
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
問題の解決策
- オランダの旗の問題。
- 3つのポインタ、P0、P1、P2、満足IDX <P0要素== 0、IDX> P1 == 2つの要素。
- 初期P0 = CUR = 0、P2 = nums.length-1。
- 要素は、CUR、交換素子、及びポインタの移動をいいます。
コード
class Solution {
public void sortColors(int[] nums) {
int p0 = 0, p2 = nums.length - 1, cur = 0;
while (cur <= p2) {
if (nums[cur] == 0) {
swap(nums, cur, p0);
p0++;
cur++;
} else if (nums[cur] == 1) {
cur++;
} else {
swap(nums, cur, p2);
p2--;
}
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}