Leetcode40
链接:力扣 。
题目:
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。
示例1:
输入:candidates = [10,1,2,7,6,1,5], target = 8
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例2:
输入:candidates = [2,5,2,1,2], target = 5
输出:
[
[1,2,2],
[5]
]
思路:
本题与上题Leetcode39大致相同。区别在于本题的集合(数组candidates)有重复元素,但结果还不能有重复的组合。因此我们只需要在上一题的思路上加一个去重的方法即可。
要如何去重呢?
这里应用到一个技巧:有序序列中重复元素一定连续出现。我们可以先把candidates做升序排序。在每层递归的for循环中,判断当前枚举的candidates[i]是否与前一元素candidates[i-1]相等,如果相等则直接跳过本次循环。
参考代码:
class Solution {
public:
vector<vector<int>> result;
vector<int> combination;
void dfs(vector<int> &candidates, int target, int index, int sum) {
if (sum > target) {
return;
}
if (sum == target) {
result.push_back(combination);
}
for (int i = index; i < candidates.size(); i++) {
if (i > index && candidates[i] == candidates[i - 1]) {
continue;
}
combination.push_back(candidates[i]);
dfs(candidates, target, i + 1, sum + candidates[i]);
combination.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
dfs(candidates, target, 0, 0);
return result;
}
};