public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(candidates == null || candidates.length == 0) return result;
Arrays.sort(candidates);
this.comSumHelper(candidates, target, 0, result, new ArrayList<Integer>(), 0);
return result;
}
public void comSumHelper(int[] candidates, int target, int start, ArrayList<ArrayList<Integer>> result,
ArrayList<Integer> curSolution, int curSum ) {
if(curSum == target) {
//System.out.print("Sol!");
result.add(new ArrayList<Integer>(curSolution));
return;
}
if(curSum < target) {
for(int i = start; i< candidates.length; i++) { // Error: use i = start, not from beginning can elimate duplicate sol
curSum += candidates[i];
curSolution.add(candidates[i]);
comSumHelper(candidates, target, i, result, curSolution, curSum);
curSum -= candidates[i];
curSolution.remove(curSolution.size()-1);
}
}
return;
}