您的位置:首页 > 其它

数字组合 II

2015-08-27 01:01 363 查看
给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。

样例

给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字
8 ,

解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]

注意

所有的数字(包括目标数字)均为正整数。

元素组合(a1, a2,
… , ak)必须是非降序(ie, a1 ≤ a2 ≤
… ≤ ak)。

解集不能包含重复的组合。

class Solution {
public:
/**
* @param num: Given the candidate numbers
* @param target: Given the target number
* @return: All the combinations that sum to target
*/
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
// write your code here
vector<vector<int> > result;
int n = num.size();
if (n < 1)
{
return result;
}

set<vector<int> > temp;
sort(num.begin(), num.end());
vector<int> buf;
visit(num, target, 0, n, buf, temp);

for (set<vector<int> >::iterator it = temp.begin(); it != temp.end(); it++)
{
result.push_back(*it);
}

return result;
}
private:
void visit(vector<int> &num, int target, int pos, int n,
vector<int> &buf, set<vector<int> > &temp)
{
if (pos >= n)
{
return;
}

if (num[pos] > target)
{
return;
}
buf.push_back(num[pos]);
if (num[pos] == target)
{
temp.insert(buf);
}
else
{
visit(num, target-num[pos], pos+1, n, buf, temp);
}
buf.pop_back();
visit(num, target, pos+1, n, buf, temp);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: