题目
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]
题目大意:在一个全部是正数的数组找出所有等于target的组合,其中每个数可以用无限次。
实现代码如下:
/*
思想:先对数组进行排序,然后进行递归,
递归的思想为:
if(candidates[i]<target){//将candidates[i]加入到所有其满足combination(candidates,target-candidates[i],i)的List中
for(List<Integer> l:combination(candidates,target-candidates[i],i)){
l.add(0, candidates[i]);
result.add(l);
}
}
*/
public class Solution {
public List<List<Integer>> combination(int []candidates,int target,int start){
if(candidates==null||candidates.length<1){
return null;
}
List<List<Integer>> result=new ArrayList<List<Integer>>();
//从start位置开始寻找,找出所有满足target的所有情况
for(int i=start;i<candidates.length;i++){
if(candidates[i]<target){//将candidates[i]加入到所有其满足combination(candidates,target-candidates[i],i)的List中
for(List<Integer> l:combination(candidates,target-candidates[i],i)){
l.add(0, candidates[i]);
result.add(l);
}
}
else if(candidates[i]==target){
List<Integer> tempList=new ArrayList();
tempList.add(candidates[i]);
result.add(tempList);
return result;//直接返回就可以了,当然也可以不加这条语句
}
else{
break;//如果当前值大于target时,后面的值一定也大于target,因此,退出循环即可。
}
}
return result;
}
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(candidates==null||candidates.length<1){
return null;
}
//第一步:对数组进行排序
Arrays.sort(candidates);
return combination(candidates,target,0);
}
}
AC结果如下