给出一组候选数字(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);
}
};