class Solution {
// 保存结果
List<List<Integer>> res = new ArrayList<>();
// 暂存
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n,k,1);
return res;
}
// startIndex是从那个数开始遍历
public void backtracking(int n,int k,int startIndex){
// 判断终止条件,当集合中的元素等于需要的元素个数时,收集结果
if(list.size() == k){
res.add(new ArrayList<>(list));
return;
}
// 遍历元素
for(int i=startIndex; i<=n; i++){
list.add(i);
backtracking(n,k,i+1);
// 回溯,将新加入的元素删除
list.remove(list.size()-1);
}
}
}
运行结果:
剪枝优化
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n,k,1);
return res;
}
public void backtracking(int n,int k,int startIndex){
if(list.size() == k){
res.add(new ArrayList<>(list));
return;
}
// list.size() 是当前集合中元素的个数
// k-list.size() 是当前集合中还需要多少元素才能收集结果
// n-(k-list.size()) + 1 代表符合当前元素个数,起始位置最多能到那个位置
for(int i=startIndex; i<=n-(k-list.size())+1; i++){
list.add(i);
backtracking(n,k,i+1);
list.remove(list.size()-1);
}
}
}
运行结果: