给定一个候选数字的集合 candidates
和一个目标值 target
. 找到 candidates
中所有的和为 target
的组合.
在同一个组合中, candidates
中的某个数字不限次数地出现.
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
// write your code here
set<vector<int>> ret;
sort(candidates.begin(), candidates.end());
multimap<int,vector<int>> mVec;
for (int i = 0; i < candidates.size(); i++)
{
int num = candidates[i];
if (num > target)
{
continue;
}
if (num == target)
{
vector<int> tmpVec;
tmpVec.push_back(num);
ret.insert(tmpVec);
continue;
}
vector<int> tmpVec;
tmpVec.push_back(num);
mVec.insert(pair<int,vector<int>>(num,tmpVec));
}
while (!mVec.empty())
{
multimap<int, vector<int>> mTmpVec;
for (auto it : mVec)
{
int sum = it.first;
vector<int> tmpVec = it.second;
int top = tmpVec.back();
for (int i = 0; i < candidates.size(); i++)
{
if (top > candidates[i])
{
continue;
}
if (sum + candidates[i] > target)
{
continue;
}
if (sum + candidates[i] == target)
{
tmpVec.push_back(candidates[i]);
ret.insert(tmpVec);
}
tmpVec.push_back(candidates[i]);
mTmpVec.insert(pair<int, vector<int>>(sum + candidates[i], tmpVec));
tmpVec = it.second;
}
}
mVec = mTmpVec;
}
vector<vector<int>> ret2;
for (auto it : ret)
{
ret2.push_back(it);
}
return ret2;
}
void test()
{
vector<int> candidates = { 2, 3, 6, 7 };
int target = 7;
vector<vector<int>> ret = combinationSum(candidates,target);
}
int main()
{
test();
getchar();
return 0;
}