トピック:
候補数の組(与えられた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]
]
分析:
所与の非繰り返し同じ要素及びターゲット、及び最終的に答えは重複組み合わせをしないを持つことができるように、必要とされる組成物(リピート)素子のアレイを構成する配列要素を。
パス、再帰検索要素のインデックスを検索する際に後方から現在のインデックス検索要素に、深さ優先探索を使用して、最終的に要素の重複組み合わせを防止するために、及び現在のターゲットへの検索の各要素は、ターゲットに変更 - 要素、ターゲットは、我々が結果セットに追加溶液を、見つかった意味し、0です。
目標値は、現在の要素よりも大きい場合に最初の昇順内のすべての要素の、検索処理は、すべての要素が背景にある要件を満たしていないことができ、早期にループを残します。
手順:
C ++
クラスのソリューション{ パブリック: ベクトル <ベクトル< int型 >> combinationSum(ベクトル< int型 >&候補者、int型のターゲット){ ベクトル <ベクトル< int型 >> RES。 ベクトル < int型 > CURR。 ソート(candidates.begin()、candidates.end()); DFS(RES、CURR、ターゲット、0 、候補); リターンのres; } ボイド DFS(ベクトル<ベクトル< INT >>&RES、ベクトル< INT > CURR、INTターゲットインデックス、ベクトル< INT >&候補){ 場合(目標== 0 ){ res.push_back(CURR)。 リターン; } のための(INT ; I <candidates.size(); ++ I =インデックスI){ 場合(候補[I]> ターゲット) ブレーク。 //は続けます。 curr.push_back(候補[I]); DFS(RES、CURR、標的 - 候補[i]は、I、候補)。 curr.pop_back(); } } }。
ジャワ
クラスのソリューション{ 公共リスト<リスト<Integer型>> combinationSum(INT []の候補者、int型ターゲット){ リスト <リスト<Integer型>> RES = 新しい LinkedListは<> (); LinkedListは <整数> CURR = 新しい LinkedListは<> (); Arrays.sort(候補); DFS(RES、CURR、ターゲット、 0 、候補); リターンのres; } プライベート 無効 DFS(一覧<一覧<整数>>解像度、LinkedListは<整数> CURR、int型のターゲット、int型のインデックス、int型[]候補){ 場合(目標== 0 ){ res.add(新しい LinkedListの<> (CURR))。 リターン; } のための(INT ; <; I ++ candidates.length iは指数= {I)の 場合(候補[I]> ターゲット)を ブレーク。 curr.addLast(候補[I]); DFS(RES、CURR、標的 - 候補[i]は、I、候補)。 curr.removeLast(); } } }