组合总和Ⅲ

Leetcode题目描述

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

回溯剪枝算法

  • 建议辅助画图,注意边界,尤其是确定target值的时候
  • 注意终止条件,每一次得到结果之后就可以进行终止计算了

回溯剪枝算法Demo

import java.util.ArrayList;
import java.util.List;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> res = new ArrayList<>();
        backtrack(k, n, 1, new ArrayList<>(), res);
        return res;
    }

    /**
     *
     * @param num 还可以使用数字的数量
     * @param target 可以用于计算的结果值
     * @param start 去重的关键,记录下一次开始的位置
     * @param tmp   一次成功的结果
     * @param res   所有结果
     */
    public void backtrack(int num, int target, int start, List<Integer> tmp, List<List<Integer>> res){
        if(target < 0) return;
        if ( num == 0){
            if( target == 0){
                res.add(new ArrayList<>(tmp));
                return;
            }
            return;
        }


        for(int i = start; i <= target; i++){
            tmp.add(i);
            backtrack(num - 1, target - i, i + 1, tmp, res);
            tmp.remove(tmp.size() - 1);
        }
    }
}
原文地址:https://www.cnblogs.com/Di-iD/p/13784995.html