给一个数组,一个target,求数组中所有和等于target的组合,要求:
数组每个数可以使用多次;
没有重复的组合;
组合中所有的数按照升序排列
code:
class Solution {
public:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
int len = candidates.size();
vector< vector<int> > res;
res.clear();
if(len == 0)
{
return res;
}
sort(candidates.begin(), candidates.end());
vector<int> temp;
temp.clear();
combineHelper(candidates, target, 0, res, temp);
}
void combineHelper(vector<int> &candidates, int target, int index, vector< vector<int> > &res, vector<int> &temp)
{
if(target < 0)
{
return;
}else if(target == 0)
{
res.push_back(temp);
return;
}
int i;
int len = candidates.size();
for(i = index; i < len; i++)
{
if(i != index && candidates[i] == candidates[i-1])//这个去重挺好的
{
continue;
}
temp.push_back(candidates[i]);
combineHelper(candidates, target - candidates[i], i, res, temp);//跟只能用一次的区别就是这里递归i,因为可以用多次
temp.pop_back();
}
}
};