1. 题目
2. 思路
(1) 回溯法
- 首先将问题转换成在一棵树上进行深度优先搜素,如下图所示:
- 可以定义一个全局栈,用于存储根结点到叶子结点的路径,当遍历到叶子结点时,将栈中的路径记录到结果集中,返回后弹出栈顶元素,相当于回溯,然后通过for循环遍历下一个叶子结点,直到遍历完所有路径。
- 可以通过设置剪枝策略大幅提高搜索效率,以n=4,k=2为例,在最上面一层for循环中,遍历1、2、3即可,无需遍历4,因为必然不满足k=2的要求。
- 如果循环结束的条件需要计算,可以反转循环方向,这样只需计算一次循环条件,可以提高效率。
3. 代码
import java.util.*;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
private int n;
private int k;
private Deque<Integer> stack;
private List<List<Integer>> res;
public List<List<Integer>> combine(int n, int k) {
this.n = n;
this.k = k;
stack = new LinkedList<>();
res = new ArrayList<>();
backtrack(1);
return res;
}
private void backtrack(int index) {
if (stack.size() == k) {
res.add(new ArrayList<>(stack));
return;
}
for (int i = n - k + 1 + stack.size(); i >= index; i--) {
stack.push(i);
backtrack(i + 1);
stack.pop();
}
}
}