1. 程式人生 > 其它 >LeetCode 77.組合 回溯

LeetCode 77.組合 回溯

LeetCode 77. 組合

給定兩個整數 n 和 k , 返回 [1,n] 中所有可能的 k 個數的組合,無順序。

  • 考到了回溯演算法,這和之前學的多源bfs有一點點相似,具體的區別我還是很模糊。

  • 再有 java 可以用List介面定義一個 ArrayList,符合java的動態繫結機制。

    class Solution {
    //公用的變數,可以放在類的屬性裡
            List<List<Integer>>ans = new ArrayList<List<Integer>>();
            LinkedList<Integer> path = new LinkedList<Integer>();
    //主函式        
        public List<List<Integer>> 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();
            }
        }
    }