lintcode-色分類-148
802 ワード
赤、白、青、長さnを含む配列を指定し、配列要素を同じ色の要素に隣接させ、赤、白、青の順に並べ替えます.
整数0,1,2を用いて,それぞれ赤,白,青を表すことができる.
サンプル
に注意
コードライブラリのソート関数を使用してこの問題を解決することはできません.
説明
かなり直接的な解決策は,カウントソートを用いて2パススキャンするアルゴリズムである.
まず,反復配列は0,1,2の出現回数を計算し,次いで配列を0,1,2の出現回数で順次上書きする.
定数レベルの余分な空間の複雑さだけを使用して配列を1回だけスキャンするアルゴリズムを考えられますか?
解題案:速い列の中で配列を区分する思想を運用する
整数0,1,2を用いて,それぞれ赤,白,青を表すことができる.
サンプル
に注意
コードライブラリのソート関数を使用してこの問題を解決することはできません.
説明
かなり直接的な解決策は,カウントソートを用いて2パススキャンするアルゴリズムである.
まず,反復配列は0,1,2の出現回数を計算し,次いで配列を0,1,2の出現回数で順次上書きする.
定数レベルの余分な空間の複雑さだけを使用して配列を1回だけスキャンするアルゴリズムを考えられますか?
解題案:速い列の中で配列を区分する思想を運用する
class Solution{
public:
int solve(vector<int> &v,int begin,int end,int color){
int slow=begin-1,fast=begin;
while(fast<end){
if(v[fast]==color)
swap(v[fast],v[++slow]);
++fast;
}
return slow;
}
void sortColors(vector<int> &nums) {
solve(nums,solve(nums,0,nums.size(),0)+1,nums.size(),1);
}
};