回溯问题可以抽象为一个n叉树,递归做嵌套循环,n相当于树的宽度,k相当于树的深度。
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.add(new ArrayList<>(path));
return;
}
for (int i = startIndex; i <= n; i++) {
path.add(i); // 处理节点
backtracking(n, k, i + 1); // 递归
path.removeLast(); // 回溯,删除处理的节点
}
}
}