美文网首页
216. Combination Sum III

216. Combination Sum III

作者: yxwithu | 来源:发表于2017-08-29 10:53 被阅读0次

    题目

    Find all possible combinations of k numbers that add up to a number n, 
    given that only numbers from 1 to 9 can be used 
    and each combination should be a unique set of numbers.
    Input: k = 3, n = 7
    Output:  [[1,2,4]]
    

    分析

    这道题和之前的Combination Sum I II类似,都可以用回溯解法。回溯解法的套路是:

    check and judge
    for each candidate:
        add(candidate);
        recursive();
        remove(candidate);
    

    check and judge : 判定解不合法或者已经达到要求,一个都不能少
    for循环里的回溯,每次添加一种可能,下一层后一定要删掉这次添加造成的影响
    本体每次只需要从上次添加的数+1开始,因为比这个数小的数添加进集合的所有可能性已经在前面考虑过了。

    代码

    public void findCombination(int k, int target, int last, List<Integer> list, List<List<Integer>> res){
        if(k == 0 && target == 0){
            res.add(new ArrayList<Integer>(list));
            return;
        }
        if(k == 0 || target < 0) return;
        
        for(int i = last + 1; i <= 9; ++i){
            list.add(i);
            findCombination(k-1, target-i, i, list, res);
            list.remove(list.size() - 1);
        }
    }
    
    
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> res = new ArrayList<>();
        if(k <= 0 || n <= 0) return res;
        List<Integer> list = new ArrayList<>();
        findCombination(k, n, 0, list, res);
        return res;
    }

    相关文章

      网友评论

          本文标题:216. Combination Sum III

          本文链接:https://www.haomeiwen.com/subject/ficodxtx.html