原题:
Given a collection of candidate numbers (
candidates
) and a target number (target
), find all unique combinations incandidates
where the candidate numbers sums totarget
.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] ]
和上一题大致相同,不同的地方在于一个数只能取一次,如果一个数出现多次可以全取,但是不能出现相同的组合,比如{1,2,1}中找3只能有{1,2}这一个组合。所以我们在上一题的基础上做一些改动就行,结果:
Success
Runtime: 4 ms, faster than 98.81% of C++ online submissions for Combination Sum II.
Memory Usage: 9.1 MB, less than 81.58% of C++ online submissions for Combination Sum II.
代码:
class Solution {
public:
vector<vector<int>> re;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> ini;
sort(candidates.begin(),candidates.end());
findsolution(0,candidates.size()-1,target,ini,candidates);
return re;
}
void findsolution(int l,int r,int remain,vector<int>& numlist,vector<int>& nums){
for(int i=l;i<=r;i++){
if(i-1>=l&&nums[i-1]==nums[i]){continue;}
if(nums[i]<remain){
numlist.push_back(nums[i]);
findsolution(i+1,r,remain-nums[i],numlist,nums);
numlist.pop_back();
}
else if(nums[i]==remain){
numlist.push_back(nums[i]);
re.push_back(numlist);
numlist.pop_back();
}
else break;
}
}
};