题目:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
思路:回溯算法递归
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> array=new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtrack(n,k);
return res;
}
public void backtrack(int n,int k){
if(k==0){
res.add(new ArrayList<>(array));
return;
}
for(int i=n;i>0;i--){
array.add(i);
combine(i-1,k-1);
array.remove(array.size()-1);
}
}
}
//剪枝优化
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> array=new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtrack(n,k);
return res;
}
public void backtrack(int n,int k){
if(k==0){
res.add(new ArrayList<>(array));
return;
}
//k-1个数中就不用在选了
for(int i=n;i>k-1;i--){
array.add(i);
backtrack(i-1,k-1);
array.remove(array.size()-1);
}
}
}