题目:
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- The solution set must not contain duplicate combinations.
2,3,6,7
and target 7
, A solution set is:
[7]
[2, 2, 3]
题解:
还是老问题,用DFS找解决方案,不同点是,这道题: The same repeated number may be chosen from C unlimited number of times.
所以,每次跳进递归不用都往后挪一个,还可以利用当前的元素尝试。
同时,这道题还要判断重复解。用我之前介绍的两个方法:
1. if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
continue;
2. if(!res.contains(item))
res.add(new ArrayList<Integer>(item));
这两个方法解决。
代码如下:
1 public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
2 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
3 ArrayList<Integer> item = new ArrayList<Integer>();
4 if(candidates == null || candidates.length==0)
5 return res;
6
7 Arrays.sort(candidates);
8 helper(candidates,target, 0, item ,res);
9 return res;
10 }
11
12 private void helper(int[] candidates, int target, int start, ArrayList<Integer> item,
13 ArrayList<ArrayList<Integer>> res){
14 if(target<0)
15 return;
16 if(target==0){
17 res.add(new ArrayList<Integer>(item));
18 return;
19 }
20
21 for(int i=start;i<candidates.length;i++){
22 if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
23 continue;
24 item.add(candidates[i]);
25 int newtarget = target - candidates[i];
26 helper(candidates,newtarget,i,item,res);//之所以不传i+1的原因是:
27 //The same repeated number may be
28 //chosen from C unlimited number of times.
29 item.remove(item.size()-1);
30 }
31 }
2 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
3 ArrayList<Integer> item = new ArrayList<Integer>();
4 if(candidates == null || candidates.length==0)
5 return res;
6
7 Arrays.sort(candidates);
8 helper(candidates,target, 0, item ,res);
9 return res;
10 }
11
12 private void helper(int[] candidates, int target, int start, ArrayList<Integer> item,
13 ArrayList<ArrayList<Integer>> res){
14 if(target<0)
15 return;
16 if(target==0){
17 res.add(new ArrayList<Integer>(item));
18 return;
19 }
20
21 for(int i=start;i<candidates.length;i++){
22 if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
23 continue;
24 item.add(candidates[i]);
25 int newtarget = target - candidates[i];
26 helper(candidates,newtarget,i,item,res);//之所以不传i+1的原因是:
27 //The same repeated number may be
28 //chosen from C unlimited number of times.
29 item.remove(item.size()-1);
30 }
31 }