元のタイトル(ミディアム):
無反復整数配列要素の組所与 NUMSをすべての可能なサブセット(パワー設定)の配列を返し、。
説明:ソリューションセットの重複サブセットを含めることはできません。
思考:回顧
深さ優先、単一のアレイメンバから出発して、以下の標識された剪定条件が重複するサブセットを防止することが探索されていない現在のインデックス、および要素が一時配列に遭遇するために添加される方法、および一時的な未満にすることはできません配列は、ソリューションセットに参加します。
1台の 空隙リコール(ベクトル<ベクトル< INT >>&RES、ベクトル< INT >&NUMS、ベクトル< INT > TMP、INT インデックス){ 2 IF(tmp.size()<= nums.size()) 。3 res.push_back( TMP); 4 用(int型 I =インデックスを、私は(nums.sizeを<); Iは++) // 添字インデックス開始、重複するサブセットを防止 5。 { 6。 tmp.push_back(NUMS [I]); / / 一時サブセット員の現在の主題、および標準部材の組み合わせと検索の深さ 。7 リコール(RES、NUMS、TMPは、私は+ 1 ) 。8 tmp.pop_backを(); // 網羅配列した後、インデックスは、現在のポップサブセットのメンバーです。 9 } 10 } 11 ベクトル<ベクトル< INT >>サブセット(ベクトル< INT >&NUMS){ 12である ベクトル<ベクトル< INT >> RES; 13である ベクトル< INT > TMP; 14 リコール(RES、NUMS、TMP、0) ; // 設定ヌル含む空集合から始まる 15件 の戻りRESを、 16 }
2考える:ビットコンピューティング
ホットコード、配列の長さを取得する、状態の数を取得する配列(状態が存在するどのように多くの多くのサブセット)subset_sum、それは8(1 << 3)、例えばsubset_sumで連続熱コードマークNUMSアレイを順次有します第二のサイクルに反映されている各要素1 << J、ホットコード番号0 001要素、ホットコード010は、第1号、ホットコードNo. 2 100です。我々は、単一の要素(I << J)によってコードされ、かつ容易にサブエレメントに集中しない知っている比較(I)の各サブセットを符号化します。例えば、I = 5、{1,3}のサブセットを表す101のバイナリの場合は、jが0(1 << 0 = 001)またはjがある場合にのみ、2(= 1 << 2 100 )、ビット単位のAND演算(001及び100の結果)は、[0]とNUMS [2]を加えたサブセット外側ループが定義NUMSを置くことができ、非ゼロでした。
1ベクトル<ベクトル< INT >>サブセット(ベクトル< INT >&NUMS){ 2 ベクトル<ベクトル< INT >> subset_set; 3 INT subset_num = 1 << nums.size(); // 配列の長さを取得し、アレイは、貸与状態の数(状態多くのサブセットことがいくつあるか) 4。 ため(int型 I = 0 ; I <subset_num; I ++は){ 5 ベクトル< INT > サブセットを、 図6 のための(INT J = 0 ; J <nums.size()。 ++ J ){ 7 IF(I&1J <<){ // 各サブセットを符号化するビット単位のAND演算をコードする単一の要素である 8。 subset.push_back(NUMS [J]); 9 } 10 } 11 ; subset_set.push_back(サブセット) 12れる } 13は、 リターンsubset_set ; 14 }