回溯开篇
77.组合
注意: 组合要求有序, 不能重复---排列无序, 可以重复
回溯模板: 递归纵向遍历, for循环横向遍历, 在for循环对节点处理, 递归, 回溯
代码:
class Solution {
List<List<Integer>> ans = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return ans;
}
public void backtracking(int n, int k, int start) {
// 递归出口
if(list.size() == k) {
ans.add(new ArrayList<>(list));
return;
}
for(int i=start; i <= n; i++){
list.add(i);
backtracking(n, k, i+1);
list.removeLast();
}
}
}
总结
- 注意回溯本质是穷举法, 所以时间复杂度一般很高
- 如果数据范围太大, 则不适合用回溯, 一般用动态规划
区别: 回溯是从顶向下, 动态规划是从底向上