LeetCode 77.組合 回溯
阿新 • • 發佈:2021-12-05
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(); } } }