leetcode216_組合總數3---回溯法
阿新 • • 發佈:2018-12-10
找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,並且每種組合中不存在重複的數字。
說明:
所有數字都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: k = 3, n = 7
輸出: [[1,2,4]]
示例 2:
輸入: k = 3, n = 9
輸出: [[1,2,6], [1,3,5], [2,3,4]]
思路:
和前兩題差不多 都可以用回溯法進行求解 因為不能重複 所以需要start 下一次遞迴都從start+1開始
貼程式碼:
// k個數 和為n public static List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if (k < 1 || n < 1) { return res; } ArrayList<Integer> list = new ArrayList<>(); // 回溯遞迴 backtrack(k, n, res, list, 1); return res; } private static void backtrack(int k, int target, List<List<Integer>> res, ArrayList<Integer> list, int start) { //先判斷 if (target == 0 && k == 0) { res.add(new ArrayList<>(list)); return; } if (target < 0 || k <= 0) //後判斷 因為都有k=0情況 return; for (int i = start; i <= 9 && target >= i; i++) { list.add(i); backtrack(k - 1, target - i, res, list, i + 1); list.remove(list.size() - 1); } }
可以將這三道題結合看 就會有回溯的一點感悟。