学习目标:
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);}}
}