40. Combination Sum II
class Solution {
public:
/**
* @param num: Given the candidate numbers
* @param target: Given the target number
* @return: All the combinations that sum to target
*/
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
// write your code here
vector<vector<int>> res;
vector<int> sum;
sort(num.begin(), num.end());
helper(0, target, num, sum, res);
return res;
}
void helper(int start, int target, vector<int> &num,
vector<int> &sum, vector<vector<int>> &res){
if(target == 0){
res.push_back(sum);
return;
}
for(int i=start; i<num.size(); i++){
if(i!=start && num[i] == num[i-1]){
continue;
}
if(num[i]>target){
break;
}
sum.push_back(num[i]);
helper(i+1, target-num[i], num, sum, res);
sum.pop_back();
}
}
};
class Solution {
public:
/**
* @param num: Given the candidate numbers
* @param target: Given the target number
* @return: All the combinations that sum to target
*/
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<vector<int>> combination;
if(num.empty())
return combination;
sort(num.begin(), num.end());
vector<int> cur;
DFS(num, target, 0, cur, combination);
return combination;
}
void DFS(vector<int> &num, int target, int start, vector<int> &cur, vector<vector<int>> &combination){
if(target==0){
combination.push_back(cur);
return;
}
else if(target<0)
return;
for(int i=start; i<num.size(); i++){
if(i!=start && num[i]==num[i-1]) //!!!!去重
continue;
cur.push_back(num[i]);
DFS(num, target-num[i], i+1, cur, combination);
cur.pop_back();
}
}
};