思路


先取1 对应三种情况
取2的时候 只能在3 4 中取下一个数
最后整体结构如图
这个树有几个孩子节点并不固定,每次递减,还是可以使用回溯方法来使用
code
class Solution {private List<List<Integer>> res = new ArrayList<>();//求解C(n,k) 当前已经找到的组合存储在c中,需要从start开始搜索新的元素private void generateCombinations(int n,int k,int start,LinkedList<Integer> c){//如果找到含有k个元素的集合 则添加到res中if(c.size()==k){res.add((LinkedList<Integer>)c.clone());return;}//从start开始搜索for(int i=start;i<=n;i++){//将当前遍历的元素加上c中c.addLast(i);//递归调用新的元素 i+1generateCombinations(n,k,i+1,c);//递归结束的时候将之前的元素出队c.removeLast();}return;}public List<List<Integer>> combine(int n, int k) {//判断边界条件if(n<=0||k<=0||k>n)return res;//start从1开始 传入一个cgenerateCombinations(n,k,1,new LinkedList<Integer>());return res;}}
