目录
组合
描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
示例 2
输入:n = 1, k = 1 输出:[[1]]
提示
方法:回溯
class Solution {
public List<List<Integer>> res;//记录最后结果
public List<Integer> path;//记录递归中的路径
public List<List<Integer>> combine(int n, int k) {
res=new ArrayList<>();
path=new ArrayList<>();
recall(1,n,k);
return res;
}
public void recall(int start,int n, int k){
for (int i = start; i <= n; i++) {
path.add(i);//将当前元素加入到path中
if (path.size()==k) {
res.add(new ArrayList<>(path));//如果当前元素已经足够了,就加入到结果中
}
else{
recall(i+1,n,k);
}
path.remove(path.size()-1);//回溯,将当前元素删除
}
}
}
方法二:回溯改进
class Solution {
public List<List<Integer>> res;//记录最后结果
public List<Integer> path;//记录递归中的路径
public List<List<Integer>> combine(int n, int k) {
res=new ArrayList<>();
path=new ArrayList<>();
recall(1,n,k);
return res;
}
public void recall(int start,int n, int k){
if (n-start+1<k) return;//如果后面的元素不够,剪枝处理
for (int i = start; i <= n; i++) {
path.add(i);//将当前元素加入到path中
k=k-1;
if (k==0) {
res.add(new ArrayList<>(path));//如果当前元素已经足够了,就加入到结果中
}
else{
recall(i+1,n,k);
}
path.remove(path.size()-1);//回溯,将当前元素删除
k=k+1;
}
}
}