本题和 组合总和 的区别在于,本题 candidates 中的每个数字在每个组合中只能使用一次。
本题数组 candidates 的元素是有重复的,而 组合总和 是无重复元素的数组candidates。
因此需要对 组合总和 的代码增加剪枝操作,来对结果进行去重。
- 每个数字在每个组合中只能使用一次,那么在递归时,起始位置 startIndex 就不能与 组合总和一样,需要将 startIndex + 1;
- 数组 candidates 中存在重复元素,那么在每层遍历中,需要跳过重复元素,不再进行递归
代码如下:
class Solution {
private:
vector<vector<int>> result;
vector<int> vec;
int sum = 0;
public:
void backtracking(vector<int>& candidates, int& target, int startIndex){
if(sum == target){
result.push_back(vec);
return;
}
for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++){
if(i > startIndex && candidates[i] == candidates[i - 1]){
continue;
}
sum += candidates[i];
vec.push_back(candidates[i]);
backtracking(candidates, target, i + 1);
sum -= candidates[i];
vec.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0);
return result;
}
};