Again, similar as the previous one, this combination sum could also be solved by DFS
http://blog.csdn.net/u010204902/article/details/8803342
How to make sure that the result is unique? We need to make sure that in the same level of DFS tree, children nodes sharing the same parent nodes are different.
E.g.
1
1
1, 2, 3
Traversing this DFS tree, we will not have duplicated result
However, if the DFS tree is like this, it will have duplicated result
1
1
1, 1, 2
Pass large test set within 48 ms
class Solution {
void find_subset(vector<int>::iterator first,vector<int>::iterator last,
vector<int> &comb, int target, vector<vector<int>> &ret){
if(target == 0){
ret.push_back(comb);
return;
}
if(target < 0)
return;
vector<int>::iterator it;
for(it = first; it != last && *it <= target; ){
comb.push_back(*it);
find_subset(it+1, last, comb, target - *it, ret);
comb.pop_back();
while(++it != last && *it == *(it-1));
}
}
public:
vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int>> ret;
sort(candidates.begin(), candidates.end());
vector<int> a;
find_subset(candidates.begin(), candidates.end(), a, target, ret);
return ret;
}
};