题目描述:
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 (a 1, a 2, … , a k) must be in non-descending order. (ie, a 1 ≤ a 2 ≤ … ≤ a k).
- The solution set must not contain duplicate combinations.
For example, given candidate set2,3,6,7and target7,
A solution set is:
[7]
[2, 2, 3]
思路解析:
- 首先给的数组是否合法
- 然后对给的数组进行排序
- 递归的进行添加元素,递归结束条件是target<0,target=0,当等于0时,符合添加到res的条件
- deal with dupicate 使用两种方法:
1.if(i>0 && candidates[i] == candidates[i-1])//deal with dupicate
continue;2. if(!res.contains(item))
res.add(new ArrayList<Integer>(item)); - 再次进入递归的时候,可以把当前元素再次尝试,所以传入的是 i 而不是i+1。
代码:
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(candidates==null || candidates.length==0)
return res;
ArrayList<Integer> item = new ArrayList<Integer>();
Arrays.sort(candidates);
helper(candidates,target,0,item,res);
return res;
}
private void helper(int[] candidates,int target,int start,ArrayList<Integer> item,ArrayList<ArrayList<Integer>> res){
if(target<0)
return;
if(target ==0){
res.add(new ArrayList<Integer>(item));
return;
}
for(int i=start;i<candidates.length;i++){
if(i>0&&candidates[i]==candidates[i-1])
continue;
item.add(candidates[i]);
int newtarget = target-candidates[i];
helper(candidates,newtarget,i,item,res);
item.remove(item.size()-1);//删除添加的最后一个
}
}
}