题目大意:在给出的数组中找出组合(数组中的数字不可以重复使用,组合不可以重复),使得组合中数字之和等于目标数字
分析:dfs。和上一道的区别在于数组中的数字不能重复使用。那么就要注意dfs时下一层不能再加当前下标位的数字了,也就是说dfs的下标要加一。
还有一个区别就是这道题的数组中有重复数字存在,所以在dfs时处理过相同数字的第一个之后,在当前层就要跳过后续的几个相同数字,否则会出现重复答案。但要保证dfs下一层时仍然会继续处理剩下的相同数字,因为他们在更深层仍然可选。
代码:
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> path;
sort(candidates.begin(), candidates.end());
dfs(0,0,target,candidates,path,result);
return result;
}
void dfs(int pos, int sum, int target, vector<int>& candidates, vector<int>& path, vector<vector<int>>& result) {
if (sum == target) {
result.push_back(path);
return;
}
if (sum > target) {
return;
}
for (int i = pos;i < candidates.size();i++) {
path.push_back(candidates[i]);
dfs(i + 1, sum + candidates[i], target, candidates, path, result);
path.pop_back();
while (i < candidates.size() - 1 && candidates[i] == candidates[i + 1])
i++; //剔除重复的i,否则答案中会出现相同解
}
}
};