class Solution {
// 记录最终结果
List<List<Integer>> res = new ArrayList<>();
// 暂存每一步
List<Integer> paths = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k,n,0,1);
return res;
}
public void backtracking(int k,int targetSum,int sum,int startIndex){
// 当前元素为k个且当前元素的总和达到目标结果时,收集结果
if(paths.size() == k){
if(sum == targetSum){
res.add(new ArrayList<>(paths));
return;
}
}
// 遍历1~9
for(int i=startIndex; i<=9; i++){
paths.add(i);
sum +=i;
// 递归
backtracking(k,targetSum,sum,i+1);
// 回溯
paths.remove(paths.size()-1);
sum -=i;
}
}
}
运行结果:
剪枝优化
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> paths = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k,n,0,1);
return res;
}
public void backtracking(int k,int targetSum,int sum,int startIndex){
// 当前结果大于目标结果,程序结束
if(sum > targetSum){
return;
}
if(paths.size() == k){
if(sum == targetSum){
res.add(new ArrayList<>(paths));
return;
}
}
// 根据集合中需要的元素个数,计算出最大下标
for(int i=startIndex; i<=9-(k-paths.size())+1; i++){
paths.add(i);
sum +=i;
backtracking(k,targetSum,sum,i+1);
paths.remove(paths.size()-1);
sum -=i;
}
}
}
运行结果: