leetcode-backtrack-40. 组合总和 II
参考:
class Solution { public: vector<vector<int>> res; vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<int> temp; sort(candidates.begin(),candidates.end()); // for(int i = 0; i < candidates.size(); i++){ // cout<<"i_"<<i<<" "<<candidates[i]<<endl; // } dfs(candidates,target,0,temp); // if(res.size()==0) // return res; // sort(res.begin(), res.end()); // res.erase(unique(res.begin(), res.end()), res.end()); return res; } void dfs(vector<int>& candidates,int target, int index, vector<int> &temp){ // for(int i = 0; i < candidates.size(); i++){ // cout<<"i_"<<i<<" "<<candidates[i]<<endl; // } // return; if(target==0){ res.push_back(temp); return; } if(target<0) return; for(int i = index; i < candidates.size(); i++){ // 去除排序后的candidate中同一层次的相同变量,可以避免重复,这句太经典了 // 前提是排序,i>index 是因为从自身后面一位开始判断重复 if(i > index&&candidates[i]==candidates[i-1]) continue; temp.push_back(candidates[i]); dfs(candidates,target-candidates[i],i+1,temp); temp.pop_back(); } } };