216. 组合总和 III - 力扣(LeetCode)

题目描述
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

输入示例

k = 3, n = 7

输出示例

[[1,2,4]]

解题思路
216. 组合总和 III - 力扣(LeetCode)_第1张图片

解题代码

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    Deque<Integer> path = new ArrayDeque<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        backtrack(n, 0, 1, k);
        return ans;
    }

    public void backtrack(int targetSum, int sum, int begin, int k) {
        // 剪枝
        if(sum > targetSum) {
            return;
        }
        // 终止条件
        if(path.size() == k) {
            // 判断是否满足条件
            if(targetSum == sum) {
                // 收集结果
                ans.add(new ArrayList<Integer>(path));
                return;
            }
        }
        // 剪枝:9 - (k - path.size()) + 1
        for(int i = begin; i <= 9 - (k - path.size()) + 1; i++) {
            path.addLast(i);
            sum += i;
            backtrack(targetSum, sum, i+1, k);
            sum -= i;
            path.removeLast();
        }
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)