LeetCode:39コンビネーション合計組み合わせ合計

试题
(重複なし)、候補数(候補)のセットとターゲット番号(ターゲット)が与えられると、標的に対する候補数の合計候補内のすべてのユニークな組み合わせを見つけます。

同じ繰り返し回数が候補数は無制限から選択することができます。

注意:

(ターゲットを含む)すべての数値は、正の整数になります。
ソリューションセットは、重複の組み合わせを含めることはできません。
例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;
    }
}
公開された557元の記事 ウォンの賞賛500 ビュー153万+

おすすめ

転載: blog.csdn.net/qq_16234613/article/details/100574204