216.Combination Sum III

題目連接:https://leetcode.com/problems/combination-sum-iii/description/數組

題目大意:與39題相似,這裏數組沒有重複數字,就是從1到9,每一個數字也不能重複選,且要求選的數字一共要是k個。ide

法一:利用39題的法一,直接暴力。代碼以下(耗時2ms):spa

 1     public List<List<Integer>> combinationSum3(int k, int n) {
 2         List<List<Integer>> res = new ArrayList<List<Integer>>();
 3         List<Integer> tmp = new ArrayList<Integer>();
 4         dfs(res, tmp, k, n, 1);
 5         return res;
 6     }
 7     public static void dfs(List<List<Integer>> res, List<Integer> tmp, int k, int n, int start) {
 8         if(tmp.size() == k) {
 9             int num = 0;
10             for(int i = 0; i < k; i++) {//計算和是不是n
11                 num += tmp.get(i);
12             }
13             if(num == n) {
14                 res.add(new ArrayList<Integer>(tmp));
15             }
16             return;
17         }
18         for(int i = start; i <= 9; i++) {
19             tmp.add(i);
20             dfs(res, tmp, k, n, i + 1);
21             tmp.remove(tmp.size() - 1);
22         }
23     }
View Code

剪枝,利用39題的第二種剪枝方法。代碼以下(耗時1ms):code

 1     public List<List<Integer>> combinationSum3(int k, int n) {
 2         List<List<Integer>> res = new ArrayList<List<Integer>>();
 3         List<Integer> tmp = new ArrayList<Integer>();
 4         dfs(res, tmp, k, n, 1);
 5         return res;
 6     }
 7     public static void dfs(List<List<Integer>> res, List<Integer> tmp, int k, int n, int start) {
 8         if(tmp.size() == k && n == 0) {
 9             res.add(new ArrayList<Integer>(tmp));
10             return;
11         }
12         else if(n > 0) {
13             for(int i = start; i <= 9; i++) {
14                 //快速剪枝
15                 if(n < i) {
16                     break;
17                 }
18                 tmp.add(i);
19                 dfs(res, tmp, k, n - i, i + 1);
20                 tmp.remove(tmp.size() - 1);
21             }
22         }
23     }
View Code
相關文章
相關標籤/搜索