问题详情
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
问题分析及思路
这道题有一种最简单的做法就是将所有的子集全部求和并与其对比,但是这样的计算量过大!下面使用递归,可以减小计算量。
需要注意的是如果有相同的数,且有解为使用了两个及以上的相同的数,则只能有一次计数,这次计数以第一个该数字为基准。防止重复。
具体代码
class Solution {
public:
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end());
vector<vector<int> > ret;
vector<int> cur;
Find(ret, cur, num, target, 0);
return ret;
}
void Find(vector<vector<int> > &ret, vector<int> cur, vector<int> &num, int target, int position)
{
if(target == 0)
ret.push_back(cur);
else
{
for(int i = position; i < num.size() && num[i] <= target; i ++)
{
if(i != position && num[i] == num[i-1])
continue;
cur.push_back(num[i]);
Find(ret, cur, num, target-num[i], i+1);
cur.pop_back();
}
}
}
};