题目:
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.
For example, given candidate set 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 }
reference: http://www.cnblogs.com/springfor/p/3884294.html