[leetcode] 77. 组合
递归回溯枚举搜就好
dfs状态(int n, int k, int last, List
n表示从[1~n]中取数,k表示当前状态下还需要取几个数,last表示上一个数取的是几,cur表示当前已经取的数。ans为总的答案list,最后要返回到main的集合。
如何枚举?比如说当n=10,k=4时
那么枚举如下,共4层循环:
- 从1到n-3选取一个数记作k1
- 从k1+1到n-2选取一个数记作k2
- 从k3+1到n-1选取一个数记作k3
- 从k3+1到n选取一个数记作k4.此时一个满足条件的答案就是
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
dfs(n, k, 0, cur, ans);
return ans;
}
private void dfs(int n, int k, int last, List<Integer> cur, List<List<Integer>> ans) {
if (k == 0) {
ans.add(new ArrayList<>(cur));
return;
}
for (Integer i = last + 1; i <= n; i++) {
cur.add(i);
dfs(n, k - 1, i, cur, ans);
cur.remove(i);
}
}
}