程序媛詹妮弗
终身学习

Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

The same repeated number may be chosen from candidates unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

Example 1:

Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
  [7],
  [2,2,3]
]

Example 2:

Input: candidates = [2,3,5], target = 8,
A solution set is:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

 

题意:

给定一个集合以及一个值target,找出所有加起来等于target的组合。(每个元素可以用无数次)

 

Solution1: Backtracking

 

code: 

 1 /*
 2 Time: O(n!)   factorial,  n!=1×2×3×…×n   
 3 Space: O(n)  coz n levels in stack for recrusion
 4 */
 5 
 6 class Solution {
 7     public List<List<Integer>> combinationSum(int[] nums, int target) {
 8         Arrays.sort(nums); // 呼应dfs的剪枝动作
 9         List<List<Integer>> result = new ArrayList<>(); 
10         List<Integer> path = new ArrayList<>(); 
11         dfs(nums, path, result, target, 0);
12         return result;
13     }
14 
15     private static void dfs(int[] nums, List<Integer> path, 
16                             List<List<Integer>> result, int remain, int start) {
17         // base case 
18         if (remain == 0) {  
19             result.add(new ArrayList<Integer>(path));
20             return;
21         }
22         
23         for (int i = start; i < nums.length; i++) {  
24             if (remain < nums[i]) return; //基于 Arrays.sort(nums); 
25             path.add(nums[i]); 
26             dfs(nums, path, result, remain - nums[i], i);
27             path.remove(path.size() - 1);  
28         }
29     }
30 }

 

posted on 2019-04-14 15:55  程序媛詹妮弗  阅读(225)  评论(0编辑  收藏  举报