题目描述:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
来源:力扣(LeetCode)
思路:’
类似上一道组合的题目;
剪枝操作各不相同,都是为了尽量将不可能符合条件的情况排除,不再尝试
代码:
1)回溯:没有剪枝的体现
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backSum(1,k,n);
return res;
}
void backSum(int start,int k,int n){
if(path.size() == k && n == 0){
res.add(new LinkedList<>(path));//将结果加入
return;
}
for(int i = start;i <= 9;i++){
path.add(i);
backSum(i + 1,k,n - i);
//这个remove保证了将每次加进来的数全部弹出!
//每次加一个保证弹出来一个
path.removeLast();
}
}
}
剪枝操作1:
if(n < 0 || path.size() > k || 9 - start + 1 + path.size() < k) return;