- 回溯算法。
- 注意剪枝
- 注意从下一个选择开始去重,直接进行下一个不重复的元素为止。
class Solution {
public:
vector<vector<int> > res; // 全局结果变量
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
if(!num.size()){
return vector<vector<int> >(res.begin(),res.end());
}
sort(num.begin(),num.end());//排序满足
vector<int> arr;
backtracking(num,target,0,0,arr);
return res;
}
void backtracking(vector<int> &num,int target,int curr, int begin, vector<int> &arr){
if(curr>=target){//剪枝
if (curr==target) res.push_back(arr);
return;
}
for(int i = begin;i<num.size();i++){
if(i>begin&&num[i]==num[i-1]) continue;//当前去重
arr.push_back(num[i]);
backtracking(num,target,curr+num[i],i+1,arr);
arr.pop_back();
}
}
};