leetcode216题组合总数III
思路:
- 递归树还是从浅到深,从深到浅。
- 剪枝的部分。
- if(sum > n) 直接返回
- 已经选择的个数 path.size();
- 还需要元素个数 k - path.size()
- 在集合n中之多要从该其实位置:n - (k - path.size())+ 1开始遍历。
- 剪枝的部分。
class Solution {
//还是回溯比较标准的一个格式
List<List<Integer>> res;
LinkedList<Integer> path;
public List<List<Integer>> combinationSum3(int k, int n) {
res = new LinkedList<>();
path = new LinkedList<>();
backTrack(k,n,1,0);
return res;
}
public void backTrack(int k,int n,int start,int sum){
if(sum > n){
return;
}
if(path.size() == k){
if(sum == n){
res.add(new LinkedList<>(path));
return;
}
}
for(int i = start;i <= 9 - (k - path.size()) + 1;i++){
path.add(i);
sum += i;
backTrack(k,n,i + 1,sum);
sum -= i;
path.removeLast();
}
}
}