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