40. 组合总和 II
题目链接:40. 组合总和 II
代码如下:
class Solution
{
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
{
vector<vector<int>> res;
if(candidates.size()<=0) return res;
sort(candidates.begin(), candidates.end());
vector<int> path;
dfs(res,path,candidates,0,target);
return res;
}
private:
void dfs(vector<vector<int>> &res,vector<int>& path,vector<int>& candidates,int begin,int target)
{
if(target<0) return;
if(0==target)
{
res.emplace_back(path);
return;
}
for(int i=begin;i<candidates.size();i++)
{
//这是因为数组已排序,后边元素更大,子集和一定超过 target
if(target-candidates[i]<0) {break;}
//如果该元素与左边元素相等,说明该搜索分支重复,直接跳过
if(i>begin&&candidates[i]==candidates[i-1]){continue;}
path.emplace_back(candidates[i]);
dfs(res,path,candidates,i+1,target-candidates[i]);//继续回溯
path.pop_back();//撤销操作
}
}
};