给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
深度优先搜索DFS,每遍历一个数字就往集合中添加,当集合中的数字达到对应的k个时,就保存到结果集合中,直接返回即可,返回后需要剔除该元素。
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> curr = new LinkedList<>();
backtrack(k, n, 1, curr, res);
return res;
}
public static void backtrack(int k, int n, int start, LinkedList<Integer> curr, List<List<Integer>> res) {
if (curr.size() == k) {
res.add(new ArrayList<>(curr));
return;
}
for (int i = start; i < n + 1; ++i) {
curr.add(i);
backtrack(k, n, i + 1, curr, res);
curr.removeLast();
}
}