同样是一个递归的题,类似与leetcode17。首先将输入的数组排序,这样能够保证先从小的数开始取,为了使得结果也是有序的,不至于重复,取一个数a要看是否大于等于已经取的数。
比如candidates=[2,3,7],target=14
如果已经取了[2,3], 再取时只能取大于等于3的数
如果没有这个限制
[2,2,3,3,2,2]
[3,3,2,2,2,2]均为答案
void combination(std::vector<std::vector<int>> &a,std::vector<int> v,std::vector<int> candidates,int target){
if(target==0){
a.push_back(v);
return;
}
for(int i=0;i<candidates.size();i++){
std::vector<int> v1=v;
if(v.size()!=0){
int d=v1.back();
if(d>candidates[i])
continue;
}
int c=target;
c=target-candidates[i];
if(c>=0){
v1.push_back(candidates[i]);
combination(a,v1,candidates,c);
}else{
return;
}
}
}
std::vector<std::vector<int>> combinationSum(std::vector<int>& candidates, int target) {
std::vector<std::vector<int>> a;
std::vector<int> v;
std::sort(candidates.begin(),candidates.end());
combination(a,v,candidates,target);
return a;
}