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]
]
分析:
II 和39的区别在于Candidate Set 的数据只能使用一次,但是Candidate 中的数据可能存在重复的,因此,添加一个previous 的标志,以保证相同的数字不会被重复使用
实现:
class Solution {
private:
vector<vector<int>> res;
int sum(vector<int> tmp)
{
int result = 0;
for (int i = 0; i < tmp.size(); i++)
{
result += tmp[i];
}
return result;
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> tmp;
sort(candidates.begin(), candidates.end());
DFSII(tmp, candidates, target, 0);
return res;
}
void DFSII(vector<int> & tmp, vector<int> & candidates, int target, int len)
{
if (target == sum(tmp))
{
res.push_back(tmp);
return;
}
elseif (target < sum(tmp))
return;
else
{
// 标志是否被重复使用int previous = -1;
for (int i = len; i < candidates.size(); i++)
{
if (previous == candidates[i]) continue;
previous = candidates[i];
tmp.push_back(candidates[i]);
// i+1 表示不被重复使用
DFSII(tmp, candidates, target, i + 1);
tmp.pop_back();
}
}
}
};
题目: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