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] ]
由题意的,给出一个数组和一个目标值target,然后找出所有组合,使得组合之和等于target值,而且数组中每个数只能用一次。这一题和上一题combination sum I 是差不多的,都是用深搜,但是需要用一个标记来标记上一次循环都用了什么数,代码如下。
Code(LeetCode运行9ms):
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> aPath;
sort(candidates.begin(), candidates.end());
dfs(candidates, target, result, aPath, 0);
return result;
}
void dfs(vector<int>& candidates, int target, vector<vector<int>>& result, vector<int>& aPath, int start) {
if (target == 0) {
result.push_back(aPath);
return;
}
int prev = -1;
for (int i = start; i < candidates.size(); i++) {
if (target < candidates[i]) {
return;
}
if (prev == candidates[i]) {
continue;
}
prev = candidates[i];
aPath.push_back(candidates[i]);
dfs(candidates, target - candidates[i], result, aPath, i + 1);
aPath.pop_back();
}
}
};