カラー分類

2422 ワード

赤、白、青、長さnを含む配列を指定し、配列要素を同じ色の要素に隣接させ、赤、白、青の順に並べ替えます.整数0,1,2を用いて,それぞれ赤,白,青を表すことができる.注意事項コードライブラリのソート関数を使用してこの問題を解決することはできません.ソートは元の配列で行う必要があります.サンプルは配列[1,0,1,2]を与え、その配列を[0,1,1,2]に並べ替える必要があります.かなり直接的な解決策に挑戦するのは,カウントソートを用いて2パススキャンするアルゴリズムである.まず,反復配列は0,1,2の出現回数を計算し,次いで配列を0,1,2の出現回数で順次上書きする.定数レベルの余分な空間の複雑さだけを使用し、配列を1回だけスキャンするアルゴリズムを考えることができますか?
#ifndef C148_H
#define C148_H
#include
#include
using namespace std;
class Solution{
public:
    /**
    * @param nums: A list of integer which is 0, 1 or 2
    * @return: nothing
    */
    void sortColors(vector<int> &nums) {
        // write your code here
        int len = nums.size();
        if (len <= 0)
            return;
        int i = 0, j = len - 1;
        int k = 0;
        while (k < len&&k <= j)
        {
            if (nums[k] == 0)
            {
                if (k == i)
                    ++k;
                else
                    swap(nums[i], nums[k]);
                ++i;
            }
            else if (nums[k] == 2)
            {
                swap(nums[k], nums[j]);
                --j;
            }
            else
                ++k;
        }
    }
};
#endif