leetcode 77. 组合

114 阅读1分钟

` class Solution { List<List> res = new ArrayList(); List list = new ArrayList(); public List<List> combine(int n, int k) { dfs1(1,k,n); //dfs2(1,k,n); return res; } private void dfs1(int index,int k,int n){ //base case if(k==0){ res.add(new ArrayList(list)); return ; } //从每一个数字开始搜索 // 这层循环代表着你这一层的选择 for(int i=index;i<=n-k+1;i++){ list.add(i); //dfs1(index+1,k-1,n);//错解 //细细品味其中的精髓 dfs1(i+1,k-1,n); list.remove(list.size()-1); } }

private void dfs2(int index,int k,int n){
    //base case
    if(k==0){
        res.add(new ArrayList(list));
        return;
    }
    if (index > n - k + 1) {
        return;
    }
    //选
    list.add(index);
    dfs2(index+1,k-1,n);
    list.remove(list.size()-1);
    //不选
    dfs2(index+1,k,n);
}

}

`

image.png 递归的含义以及如何更好的理解 n=4 k=2

index 在递归树中某一层中从哪里开始做选择 for 的意义:某一个节点有多少分支 剪枝条件:当来到某个位置,你发现你不够凑出k了,即所用的元素不够用了 由于此题中无重复元素,故不需要小剪枝

dfs(i+1) 为什么是i+1 而不是index+1 , index+! 和 递归的初始位置没关系啊!! 这是貌似是一个局部变量和全局变量的事情 你下一层递归的初始数字的选择取决于i+1 ,而不是index+1 ,index+1 是数组的一个固定的位置

暂存的疑惑!!!可以问一下老师

递归函数我理解为一个动作,而其参数就是其初始状态递归就是往深一层搜索,一定要结合递归树来看,你可以理解它是一棵树

image.png