77 组合
https://leetcode.cn/problems/combinations/description/
方法一:一共k层,每层从剩下的数中依次选一个数,直到k层返回,决定不选的数就不再进入下一层备选集合中。TO(n^k)
方法二:一共n层,每层决定第i个数是选还是不选, 选够k个可以提前返回。TO(2^n)
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<Integer> cur = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
dfs(n, k, cur, result, 0);
return result;
}
private void dfs(int n, int k, List<Integer> cur, List<List<Integer>> result, int index) { //选或不选index之前的数字已经在上层考虑过了
// 现在要考虑的是在 cur的index 的位置上放什么的数?这个数只能是index之后的数
if (cur.size() == k) {
result.add(new ArrayList<>(cur));
return;
}
for (int i = index; i < n; i++) {
cur.add(i + 1);
dfs(n, k, cur, result, i + 1); //bug, 这层选了i, 下一层得从 i + 1选起,不是index + 1
cur.remove(cur.size() - 1);
}
}
}
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
dfs(1, n, k, result, cur);
return result;
}
private void dfs(int index, int n, int k, List<List<Integer>> result, List<Integer> cur) {
if (cur.size() == k) {
result.add(new ArrayList<>(cur));
return;
}
if (index > n || k - cur.size() > n - index + 1) {
return;
}
cur.add(index);
dfs(index + 1, n, k, result, cur);
cur.remove(cur.size() - 1);
dfs(index + 1, n, k, result, cur);
}
}