学习目标:
1.用递归进行组合(非剪枝)
2.用递归进行组合(剪枝版)
1.用递归进行组合(非剪枝)
做法优点:当需要排列50个数的时候,套循环不可能套这么多,这时候用到递归。
易错点:在回溯的过程中:
dfs(n,k-1,i+1);
我写成了
dfs(n,k--,i++);
这是大错误,我debug了半天才发现,如果用下面这种写法不能达到回溯的效果,因为虽然传入的数字是对的,但是改变了原有k,i的值,导致后续的取值错误。
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList();
public List<List<Integer>> combine(int n, int k) {
dfs(n,k,1);
return res;
}
public void dfs(int n , int k ,int start){
if(k == 0) {
res.add(new ArrayList<>(path));
return;
}
for (int i = start; i <= n; i++) {
path.add(i);
dfs(n,k-1,i+1);
path.remove(path.size()-1);
}
}
}
2.用递归进行组合(剪枝版)
原理:在1的基础上对i的取值范围进行缩少,对时间空间的占用较少
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList();
public List<List<Integer>> combine(int n, int k) {
dfs(n,k,1);
return res;
}
public void dfs(int n , int k ,int start){
if(k == 0) {
res.add(new ArrayList<>(path));
return;
}
for (int i = start; i + k -1 <= n; i++) {
path.add(i);
dfs(n,k-1,i+1);
path.remove(path.size()-1);
}
}
}