试题
(重複なし)、候補数(候補)のセットとターゲット番号(ターゲット)が与えられると、標的に対する候補数の合計候補内のすべてのユニークな組み合わせを見つけます。
同じ繰り返し回数が候補数は無制限から選択することができます。
注意:
(ターゲットを含む)すべての数値は、正の整数になります。
ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
入力:候補= [2,3,6,7-]、目標= 7、
解集合である:
[
[7]、
[2,2,3-]
]
例2:
INPUT:= [2,3,5] =ターゲットに候補8、
A IS SET対処:
[
[2,2,2,2]、
[2,3,3]、
[3,5]
]
コードである
実質的にはっきり貪欲DPその後、残りは横断され、考慮されていません。どのようにポイントが[223]と[322]この同じセットが、状況の異なる並べ替えを避けるためであることに留意すべき。これは、番号の数が使用できない場合、フロントを使用するときに考慮することができます。
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> out = new ArrayList<List<Integer>>();
findAll(candidates, target, out, new ArrayList<Integer>(), 0, 0);
return out;
}
// sum用来统计当前遍历的求和,repeat用来记录当前使用到的temp里的最后一个数的index
public void findAll(int[] candidates, int target, List<List<Integer>> out, ArrayList<Integer> temp, int sum, int repeat){
if(sum == target){
out.add((ArrayList)temp.clone());
return;
}
// 为了保证我们不会出现相同集合但是排序不同的情况,我们采用每次尽可能把当前数都探索完。比如repeat = 0,此时index为0的数应该使用了多次,那么我们可以继续使用下去,或者是不再考虑index=0的数,而是开始考虑index=1的数。
for(int i = repeat; i < candidates.length; i++){
int num = candidates[i];
if(sum + num <= target){
temp.add(num);
findAll(candidates, target, out, temp, sum+num, i);
temp.remove(temp.size()-1);
}
}
return;
}
}