算法描述:
Given a collection of candidate numbers (candidates
) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
Each number in candidates
may only be used once in the combination.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates =[10,1,2,7,6,1,5]
, target =8
, A solution set is: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
Example 2:
Input: candidates = [2,5,2,1,2], target = 5, A solution set is: [ [1,2,2], [5] ]
解题思路:求所有可能性的题目,首先想到回溯法。这道题目中的重点是去重。
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); vector<vector<int>> results; vector<int> temp; combine(candidates, temp, target, results, 0); return results; } void combine(vector<int>& candidates, vector<int>& temp, int target, vector<vector<int>>& results, int begin){ if(target ==0){ results.push_back(temp); return; } for(int i=begin; i < candidates.size() && target >= candidates[i]; i++){ if(i > begin && candidates[i]==candidates[i-1]) continue; temp.push_back(candidates[i]); combine(candidates,temp,target-candidates[i],results,i+1); temp.pop_back(); } }