明显的回溯和递归的区别:回溯是这个状态走完之后,回到上一个状态去,继续寻找下一个状态;递归是这个此时的这个状态会用到上一个状态的结果。
这道题是经典的回溯+回头的题
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> res = new ArrayList<>();
if(k>n || n<1){
return list;
}
dfs(n,k,1,list,res);
return list;
}
void dfs(int n,int k,int begin,List<List<Integer>> list,List<Integer> res){
//位数到了就停止
if(res.size() == k){
list.add(new ArrayList<>(res));
return;
}
for(int i=begin;i<=n;i++){
res.add(i);
//i+1,不能添加重复的元素
dfs(n,k,i+1,list,res);
//深度优先有回头的过程
res.remove(res.size()-1);
}
}
}