class Solution {
private Integer n;
private List<Integer> chosen = new ArrayList<>();
private List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
this.n = n;
//注意这个题意是从1开始的
recur(1,k);
return result;
}
public void recur(int cur,int k){
//0 : 剪枝。减去子树多余的枝丫。如果当前chosen已经 > k了,或者chosen + 剩余的n 长度已经不满足k了就可以提前返回
if(chosen.size() > k || chosen.size() + (n - cur + 1) < k){
return;
}
//1:递归结束条件,只要chosen的长度==k就结束了。
//为什么不用考虑cur > n的情况呢,因为上面的剪枝操作已经给减掉了,不用考虑了。
//递归结束条件一定要想清楚。78题不包含n是因为当前内个cur是代表下标所以只到n-1
if(chosen.size() == k){
//这块要想清楚
result.add(new ArrayList<>(chosen));
return;
}
//2:递归方法,相似的方法
//如果不要这个当前数就直接往下走
recur(cur + 1,k);
//如果要这个数,就把cur存到chosen里面然后再往下走
chosen.add(cur);
recur(cur + 1,k);
//3:还原现场,把当前这一层加入的数弹出来
chosen.remove(chosen.size()-1);
}
}