这种类型的题目有两种,
第一种情况下可以对里面的数字重复使用,
vector<vector<int>> vec;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<int> local;
check(candidates,target,0,local);
return vec;
}
void check(vector<int>& a,int target,int index,vector<int> &local)
{
if(target==0)
{
vec.push_back(local);
return;
}
for(int i=index;i!=a.size()&&target>=a[i];i++)
{
local.push_back(a[i]);
check(a,target-a[i],i,local);
local.pop_back();
}
}
第二种情况,组合成的数组里面的数字不允许重复,
vector<vector<int>> vec;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
int len = candidates.size();
if(len==0)
return vec;
vector<int> local;
check(candidates,0,target,local);
return vec;
}
void check(const vector<int>& a,const int& index,int target,vector<int>& local)
{
if(target==0)
{
vec.push_back(local);
return;
}
else
{
for(int j = index;j<a.size();j++)
{
if(a[j]>target)
return;
if(j && a[j]==a[j-1] && j>index)
continue;
local.push_back(a[j]);
check(a,j+1,target-a[j],local);
local.pop_back();
}
}
}