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]
LL's solution:
DFS
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
public void DFS(int[] candidates,ArrayList<Integer> current,int index,int target){
if(target<0 || index>candidates.length-1)
return;
else if(target==0)
res.add(current);
else{
// left branch, not add the node
DFS(candidates,new ArrayList<Integer>(current),index+1,target);
// right branch, add the node as many as possible
int node = candidates[index];
while(target-node>=0){
current.add(node);
target = target-node;
DFS(candidates,new ArrayList<Integer>(current),index,target);
}
}
return;
}
public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int len = candidates.length;
if(len<1)
return res;
res.clear();
Arrays.sort(candidates);
ArrayList<Integer> current = new ArrayList<Integer>();
DFS(candidates,current,0,target);
HashSet st = new HashSet();
st.addAll(res);
res.clear();
res.addAll(st);
return res;
}
}
Note:
1. DFS做出来res会有重复,因为相同的结果是从不同的路径走出来的,最后要去重(用HashSet)。
2. 要求res里面要从小到大sorted,需保证两点:1. candidate是soted,2. 顺序遍历candidate
若要求从大到小sorted,则只需更改以下几行:
4 if(target<0 || index>candidates.length-1) -> if(target<0 || index<0)
10 DFS(candidates,new ArrayList<Integer>(current),index+1,target); -> index-1
30 DFS(candidates,current,0,target) -> DFS(candidates,current,len-1,target)