40. Combination Sum II
题目
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]
]
解析
- 这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i – 1]) continue; 这样可以防止res中出现重复项,然后就在递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了
// add 40. Combination Sum ii
class Solution_40 {
public:
void dfs(vector<vector<int>> &vecs, vector<int> &vec, int i, int target, vector<int> &candidates)
{
if (target == 0)
{
vecs.push_back(vec);
return;
}
if (target < 0)
{
return;
}
// 1 1 2 5 6 (1,1,6;1 2 5)
for (int k = i; k < candidates.size(); k++)
{
if (k>i && candidates[k] == candidates[k - 1]) //k>0 bug
{
continue;
}
vec.push_back(candidates[k]);
dfs(vecs, vec, k+1, target - candidates[k], candidates);
vec.pop_back();
}
return;
}
// 默认有序
vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
vector<vector<int>> vecs;
vector<int> vec;
if (candidates.size() == 0)
{
return vecs;
}
sort(candidates.begin(), candidates.end());
dfs(vecs, vec, 0, target, candidates);
return vecs;
}
};
题目来源