LeetCode 77.组合 回溯


LeetCode 77. 组合

给定两个整数 n 和 k , 返回 [1,n] 中所有可能的 k 个数的组合,无顺序。

  • 考到了回溯算法,这和之前学的多源bfs有一点点相似,具体的区别我还是很模糊。

  • 再有 java 可以用List接口定义一个 ArrayList,符合java的动态绑定机制。

    class Solution {
    //公用的变量,可以放在类的属性里
            List>ans = new ArrayList>();
            LinkedList path = new LinkedList();
    //主函数        
        public List> combine(int n, int k) {
        backtracking(1,n,k);
        return ans;    
        }
    //递龟函数,
        void backtracking(int i , int n , int k){
            
            if(path.size()==k){
                ans.add(new LinkedList(path));
                return;
            }
    //这里为了剪枝 k-path.size 表示还需要多少数字, 整体就表示至少j的下标为多少才能保证
    //有k个数可以组成一个数组
            for(int j = i; j<=n-(k-path.size())+1  ;j++){
                    path.add(j);
    //想象一下程序一运行到这里,就开了一个新栈,在新栈里从头运行(变了个参数),,,直到最后一个
    //程序path.size == k,这时候最里边,也就是最后开的程序栈结束,
    //对应着倒数第二个栈的backtracking执行完了,走到了path.remove
    //然后继续倒数第二个的for。。。
                    backtracking(j+1, n , k);
                    path.removeLast();
            }
        }
    }