39.コンビネーション合計
中
候補数の組(与えられたcandidates
(重複なし))とターゲット番号(target
)内のすべてのユニークな組み合わせを見つける candidates
の候補数の合計 target
。
同じ繰り返し数は、から選択することができる candidates
回数無制限の数。
注意:
- (を含むすべての数値
target
)は、正の整数になります。 - ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
入力:候補=[2,3,6,7],
ターゲット=7
、 解集合である: [ [7]、 [2,2,3-] ]
例2:
入力:候補= [2,3,5],
ターゲット= 8、 ソリューションセットである: [ [2,2,2,2]、 [2,3,3]、 [3,5] 】
特別ポイント:
1。空pop_back();删除最后一个元素
2.栈、队列用プッシュ、ベクトル用の一back
あなたは奇妙な問題に直面3.Ifは、それが次のエラーの他の理由のため、かもしれませんが、そうするとき
、あなたはそれを解決する方法がわかりませんただ、コンパイラを信じて、よりerror.Don'tを読む.Just。
4.This機能は、このように我々は変更することができ、ベクトルの定義を追加&後に必要な
ベクトルの値そのものを。
ループのための2つの5.use、出力するベクトルの値<ベクトル<INT >>
する#include <stdio.hに> する#include <iostreamの> する#include <ベクトル> の#include <アルゴリズム> の#include <スタック> の#include < ストリング > の#include <メモリ> の#include <memory.h> 使用して 名前空間STD。 クラスのソリューション{ パブリック: ベクトル <ベクトル< int型 >> combinationSum(ベクトル< int型 >&候補者、int型のターゲット){ ベクトル <ベクトル< int型 >> ANS; ベクトル <CUR; ソート(candidates.begin()、candidates.end()); DFS(候補者、ターゲット、0 、CUR、ANS)。 戻るANSを。 } プライベート: ボイド DFS(ベクトル< INT >&候補、int型のターゲット、INT S、ベクトル< INT >&CUR、ベクトル<ベクトル< INT >>&ANS) { 場合(目標== 0 ) { ans.push_back(CUR ); 返します。 } のために(int型 I = sで、iがcandidates.sizeを<(); ++ i)が { もし(候補[I]>ターゲット)ブレーク。 cur.push_back(候補[I]); DFS(候補ターゲット - 候補[i]は、I、CUR、ANS)。 cur.pop_back(); } } }。 INT メイン() { 溶液S。 ベクトル <ベクトル< int型 >> RES。 ベクター < INT >候補= { 2、3、5 }。 RES = s.combinationSum(候補、8 )。 ベクトル < int型 >temp_vect; 以下のための(ベクトル<ベクトル< int型 >> ::イテレータITE = res.begin()!; ITE = res.end(); ITE ++ ) { temp_vect = * ITE; 以下のために(ベクトルは< 整数 > ::イテレータITEEはtemp_vect.beginを()=;!ITEE = temp_vect.endを(); ITEE ++ ) { coutの << * ITEE。 } COUT << ENDL。 } 戻り 0 。 }
40.コンビネーション合計II
中
候補数の収集(考えるcandidates
)とターゲット番号(target
)、内のすべてのユニークな組み合わせを見つける candidates
に候補数の合計 target
。
各数は candidates
組み合わせのみで一度使用することができます。
注意:
- (を含むすべての数値
target
)は、正の整数になります。 - ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
入力:候補=[10,1,2,7,6,1,5]
、ターゲット=8
、 解集合である: [ [1,7]、 [1、2、5]、 [2,6]、 [1,1]、[6] ]
例2:
入力:候補= [2,5,2,1,2]、目標= 5、 解集合である: [ [1,2,2]、 [5] ]
特別なアイデアは:
この問題は、おそらく39である
我々は唯一変更する必要がある
-それが唯一の一意の値を格納することができ、set.Setは特別な属性を持っている」とソートされます1.vectorを
自動的に。
2.戻り値を直接返すことができない、それは横方向する必要がベクトルとして<ベクトル<int型>>(ans.begin()、ans.end());
3. DFS機能でベクトルの属性も対応する変更する必要があります。
私は+ 1に変更する必要がある4。再帰的には、自分自身を追加しないことを意味します。
する#include <stdio.hに> する#include <iostreamの> する#include <ベクトル> の#include <アルゴリズム> の#include <スタック> の#include < ストリング > の#include <メモリ> の#include <memory.h> の#include <hash_map> #含める <マップ> 書式#include < 設定 > 書式#include <unordered_map> 使用して 名前空間はstdを、 クラスのソリューション{ パブリック: ベクトル <ベクトル< int型 >> combinationSum2(ベクトル<ターゲット){ セット <ベクトル< INT >> ANS。 ベクトル < int型 > CUR。 ソート(candidates.begin()、candidates.end()); DFS(候補者、ターゲット、0 、CUR、ANS)。 リターンベクトル<ベクトル< int型 >> (ans.begin()、ans.end()); } プライベート: ボイド DFS(ベクトル< INT >&候補、int型のターゲット、INT S、ベクトル< INT >&CUR、設定 <ベクトル< INT >>&ANS) { もし(ターゲット== 0 ) { ans.insert(CUR)。 // ans.push(CUR)。 返します。 } のための(int型 I = Sは、iが<(candidates.sizeを); ++ I) { 場合(候補[I]>ターゲット)ブレーク。 cur.push_back(候補[I]); DFS(候補ターゲット -candidates [i]は、I + 1 、CUR、ANS)。 cur.pop_back(); } } }。 INT メイン() { 溶液S。 ベクトル <ベクトル< int型 >>解像度; ベクター < INT >候補= { 10、1、2、7、6、1、5 }。 RES = s.combinationSum(候補、8 )。 ベクトル < int型 > temp_vect。 以下のための(ベクトル<ベクトル< int型 >> ::イテレータITE = res.begin()!; ITE = res.end(); ITE ++ ) { temp_vect = * ITE; 以下のための(ベクトル< int型 ITEE = temp_vect.end();;!> ::)ITEEは(temp_vect.beginを=イテレータITEE ++) { COUT << * ITEE。 } COUT << ENDL。 } 戻り 0 。 }