您的位置:首页 > 其它

LeetCode_Combination Sum

2013-06-30 11:32 232 查看
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]


vector<vector<int> > combinationSum(vector<int> &arr, int target)
{
vector<vector<int> > ans;
int size = arr.size();
if (size == 0)
return ans;

sort(arr.begin(), arr.end());
vector<pair<int, vector<int> > > vec;
int *indexArr = new int[size];
for (int i = 0; i < size; ++i)
{
indexArr[i] = i;
vector<int> tmp;
tmp.push_back(arr[i]);
if (arr[i] == target)
{
ans.push_back(tmp);
}
else
{
vec.push_back(make_pair(arr[i], tmp));
}
}
int end = vec.size();
int index = 0;
while (index < vec.size())
{
for (int i = 0; i < size; ++i)
{
int curNum = arr[i];
int from = indexArr[i];
indexArr[i] = vec.size();
// 如果是最后一个,就到第0个
int to = end;
for (int j = from; j < to; ++j)
{
int sum = vec[j].first;
++index;
vector<int> tmp = vec[j].second;
if (sum + curNum <= target)
{
tmp.push_back(curNum);
if (sum + curNum == target)
{
sort(tmp.begin(), tmp.end());
ans.push_back(tmp);
}
else
{
vec.push_back(make_pair(sum + curNum, tmp));
}
}
}
}
index = end;
end = vec.size();
}
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: