经典排列组合,C4中取2 hhhhhhhhhhh
for循环横向遍历,递归纵向遍历,回溯不断调整结果集
递归三部曲
①入参,确定一个数后,下一个数的区间会对应变小,所以除了K,N之外还需要一个index记录开始位置
②终止条件,list的size和K相等就加入到结果集中,然后返回
③单层处理逻辑,把当前位置的值加到list中,然后递归下一层,即index + 1
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
dfs(1, n, k);
return res;
}
public void dfs(int startIndex, int n, int k) {
if (list.size() == k) {
res.add(new ArrayList<>(list)); // 直接加入list的话,其实是同一个引用
return;
}
for (int i = startIndex; i <= n - (k - list.size()) + 1; i++) {
list.add(i);
dfs(i + 1,n ,k); // 注意变量的取值
list.removeLast();
}
}
}