题目描述
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
输入示例
k = 3, n = 7
输出示例
[[1,2,4]]
解题思路
解题代码
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();
}
}
}