思路:DFS查找
1. 首先对数组进行排序,方便查找的时候如果当前元素加入之后超出target,那么后面的元素就不需要再加了
2.然后进行DFS查找,如果满足要求则输出到结果中
3.注意的是出现重复的组合要避免,
代码如下:
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> temp;
//进行排序
sort(candidates.begin(),candidates.end());
//进行dfs查找结果
dfs(candidates,target,temp,0);
return res;
}
//存放结果
vector<vector<int>> res;
void dfs(vector<int>& candidates, int target,vector<int> temp,int index){
//如果目前组合里面的sum==target,则是一个符合要求的组合
if(target==0){
res.push_back(temp);
return;
}
//进行遍历找到合适的组合
for(int i=index;i<candidates.size();i++){
//如果当前元素与上一个元素相等且当前i不是第一个元素,比如 1 1 1 6 第一次取了1(first) 1(second) 6,走到第二个1(second) 1(third) 6就不能再取了
if(i > index && candidates[i]==candidates[i-1]) continue;
//如果加入当前元素会超出target的值,则跳出,因为后面的数更大,还会超出
if(target-candidates[i]<0) break;
//存入当前元素
temp.push_back(candidates[i]);
//接着往下遍历
dfs(candidates,target-candidates[i],temp,i+1);
//弹出之前元素
temp.pop_back();
}
return;
}
};