思路:使用回溯+减枝来获取组合,由于组合内不重复,并且为1-9的整数,解空间树的如下图所示:
代码及代码说明如下:
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> resList = new ArrayList<>();
//遍历解空间树
dfs(resList, new ArrayList<>(), k, n, 1);
return resList;
}
private void dfs(List<List<Integer>> resList, List<Integer> curList, Integer k, Integer n, Integer start) {
//判断是否到达树底部或是否总和已经大于n,如果大于n则减枝
if(curList.size() >= k || n < 0 ) {
return;
}
//循环当前层
for(int i = start; i <= 9; i++) {
curList.add(i);
//计算深度遍历到当前位置的和,和n的差值,用于后面的减枝操作。
int v = n - i;
//判断是否为正确解
if(v == 0 && curList.size() == k) {
resList.add(new ArrayList<>(curList));
}
//进入子节点
dfs(resList, curList, k, v, i + 1);
//从子节点返回,删除子节点数据,返回当前层。
curList.remove(curList.size()-1);
//减枝操作,如果相加数值已经大于n则无需在继续循环
if(v <= 0) {
break;
}
}
}
}