题目:
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
方法:灵神-组合型回溯 剪枝
class Solution {
private int k;
private final List<Integer> path = new ArrayList<>();
private final List<List<Integer>> ans = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
this.k = k;
dfs(n);
return ans;
}
private void dfs(int i) {
int d = k - path.size(); // 还要选d个数
if (d == 0) {
ans.add(new ArrayList<>(path));
return;
}
if (d < i) // 不选i
dfs(i - 1);
// 选i
path.add(i);
dfs(i - 1);
path.remove(path.size() - 1);
}
}