思路:解法和39题类似,改动了两处:
1、因为题目要求每个元素只能出现一次(不代表每个数只能有一个,因为数据中会有重复的数字),所以代码中21行搜索时下一次循环的位置+1;
2、将临时存放答案的vector<vector<int>>类型改为set<vector<int>>类型,避免重复。
1 class Solution { 2 public: 3 int size = 0; 4 set<vector<int>> ans; 5 void search(int pos, vector<int>& candidates, int target, vector<int>& res, int sums){ 6 if(sums == target){ 7 ans.insert(res); 8 return; 9 } 10 if (pos >= size) return; 11 for(int i = pos; i < size; i++) 12 { 13 if(candidates[i] > target) return; 14 sums += candidates[i]; 15 res.push_back(candidates[i]); 16 if(sums > target){ 17 sums -= candidates[i]; 18 res.pop_back(); 19 return; 20 } 21 search(i + 1, candidates, target, res, sums); 22 sums -= candidates[i]; 23 res.pop_back(); 24 } 25 26 } 27 28 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { 29 sort(candidates.begin(), candidates.end()); 30 size = candidates.size(); 31 vector<int> res; 32 search(0, candidates, target, res, 0); 33 vector<vector<int>> out(ans.begin(),ans.end()); 34 return out; 35 } 36 };