1. 思路
和前一个题目类似,只不过这里要求每个数只能用一次。
所以这里我们需要先将数组排序。然后dfs递归的时候保证不选取重复的数字即可。
2.代码
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> temp;
sort(candidates.begin(), candidates.end());
dfs(ret, 0, 0, 0, temp, candidates, target);
return ret;
}
void dfs(vector<vector<int>>& ret, int sum, int pos, int start, vector<int>& temp, vector<int>& candidates, int target)
{
if(sum == target)
{
temp.resize(pos);
ret.push_back(temp);
return;
}
temp.resize(pos + 1);
for(int i = start; i < candidates.size(); ++i)
{
if(sum + candidates[i] > target ||
i != start && candidates[i] == candidates[i-1]) //注意这个判断
continue;
temp[pos] = candidates[i];
dfs(ret, sum + candidates[i], pos + 1, i + 1, temp, candidates, target);
}
}
};