题目地址: Combination Sum
描述:
Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
The same repeated number may be chosen from candidates unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
Example 2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
import java.util.*;
public class CombinationSum {
public static Integer combinationSum(int[] candidates, int target, ArrayList<Integer> list, ArrayList<ArrayList<Integer>> res, HashSet<List> hashSet) {
int ret = target;
int i = candidates.length - 1;
while (target > 0 && i > -1) {
int suxTarget = target - candidates[i];
if(suxTarget > -1){
list.add(candidates[i]);
}
ret = combinationSum(candidates, suxTarget, list, res, hashSet);
if (ret == 0) {
if(suxTarget==0){
//去重
ArrayList<Integer> temp = new ArrayList<>(list);
temp.sort(Comparator.naturalOrder());
if(!hashSet.contains(temp)) {
res.add(temp);
hashSet.add(temp);
}
}
list.remove(list.size()-1);
}
i--;
}
return ret;
}
public static void main(String[] args) {
int[] candidates = {1, 6, 2, 5, 3};
Arrays.sort(candidates);
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
HashSet<List> hashSet = new HashSet<>();
combinationSum(candidates, 8,new ArrayList<>(),res,hashSet);
System.out.println(res);
}
}