image.png

思路

image.png
image.png
先取1 对应三种情况
取2的时候 只能在3 4 中取下一个数
最后整体结构如图
image.png
这个树有几个孩子节点并不固定,每次递减,还是可以使用回溯方法来使用

code

  1. class Solution {
  2. private List<List<Integer>> res = new ArrayList<>();
  3. //求解C(n,k) 当前已经找到的组合存储在c中,需要从start开始搜索新的元素
  4. private void generateCombinations(int n,int k,int start,LinkedList<Integer> c){
  5. //如果找到含有k个元素的集合 则添加到res中
  6. if(c.size()==k){
  7. res.add((LinkedList<Integer>)c.clone());
  8. return;
  9. }
  10. //从start开始搜索
  11. for(int i=start;i<=n;i++){
  12. //将当前遍历的元素加上c中
  13. c.addLast(i);
  14. //递归调用新的元素 i+1
  15. generateCombinations(n,k,i+1,c);
  16. //递归结束的时候将之前的元素出队
  17. c.removeLast();
  18. }
  19. return;
  20. }
  21. public List<List<Integer>> combine(int n, int k) {
  22. //判断边界条件
  23. if(n<=0||k<=0||k>n)
  24. return res;
  25. //start从1开始 传入一个c
  26. generateCombinations(n,k,1,new LinkedList<Integer>());
  27. return res;
  28. }
  29. }