77. 组合
题目链接:77. 组合
思路: 回溯的本质是暴力穷举。回溯法解决的问题都可以抽象为树形结构,解决一个回溯问题,实际上就是一个决策树的遍历过程。回溯法模版的其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」。
定义全局变量res来记录符合条件的路径,track来记录当前路径。使用回溯法的框架,第一步写结束条件,对于组合问题来说,当前路径的长度符合要求时,把当前track加入res,return。for循环代表每一步时的每一种选择,做出选择时,更新track,递归,出递归后,更新track撤销选择。
class Solution {
// 记录回溯算法的递归路径
List<List<Integer>> res = new LinkedList<>();
// 记录当前路径
LinkedList<Integer> track = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtrack(n, 1, k);
return res;
}
void backtrack(int n, int start, int k) {
if (track.size() == k) {
res.add(new LinkedList<>(track));
return;
}
for (int i = start; i <= n; i++) {
track.addLast(i);
backtrack(n, i + 1, k);
track.removeLast();
}
}
}
总结: