77. 组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
class Solution {
// 执行用时:2 ms, 在所有 Java 提交中击败了97.53%的用户
// 内存消耗:40.9 MB, 在所有 Java 提交中击败了87.58%的用户
//数组题,也用到了回溯法
//此处递归,利用Deque<Integer> dp记录上一层反过来的当前数组
public List<List<Integer>> combine(int n, int k) {
Deque<Integer> dp = new ArrayDeque<>();
List<List<Integer>> res = new ArrayList<>();
dfs(n , k, dp, res);
return res;
}
public void dfs(int n, int k, Deque<Integer> dp,List<List<Integer>> res) {
//dp[n,k],当n=0时,返回当前数组中的数
if(k == 0){
res.add(new ArrayList<>(dp));
return;
}
//dp[n,k],当n=k时,返回当前数组加上前n个数
if(n == k){
for(int i = 1; i <= n;++i){
dp.addLast(i);
}
res.add(new ArrayList<>(dp));
for(int i = 1; i <= n;++i){
dp.removeLast();
}
return;
}
//第n个不要
dfs(n - 1, k , dp, res);
//算上第n个
dp.addLast(n);
dfs(n - 1, k - 1 , dp, res);
dp.removeLast();
}
}