[Leetcode] Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- The solution set must not contain duplicate combinations.
For example, given candidate set 10,1,2,7,6,1,5
and target 8
,
A solution set is: [1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
记录当前idx之前的元素在结果中是否被使用,如果之前的与当前元素相等的元素没有被使用的话,那么这个元素也不应该被使用,这样就可以去重了。比如[1, 1, 2],如果第一个1没有被使用,那么第二个1也不能使用。
1 class Solution { 2 public: 3 void findNext(vector<int> &num, int target, vector<vector<int> > &res, vector<int> &v, int idx, int sum, vector<bool> &flag) { 4 if (sum > target || idx > num.size()) return; 5 if (sum == target) { 6 res.push_back(v); 7 return; 8 } 9 bool fflag = false; 10 for (int i = idx-1; i >= 0; --i) { 11 if (num[i] == num[idx] && !flag[i]) { 12 fflag = true; 13 break; 14 }; 15 if (num[i] != num[idx]) break; 16 } 17 if (!fflag) { 18 v.push_back(num[idx]); 19 flag[idx] = true; 20 findNext(num, target, res, v, idx+1, sum+num[idx], flag); 21 flag[idx] = false; 22 v.pop_back(); 23 } 24 findNext(num, target, res, v, idx+1, sum, flag); 25 } 26 27 vector<vector<int> > combinationSum2(vector<int> &num, int target) { 28 vector<vector<int> > res; 29 vector<bool> flag(num.size(), false); 30 vector<int> v; 31 sort(num.begin(), num.end()); 32 findNext(num, target, res, v, 0, 0, flag); 33 return res; 34 } 35 };
直接找的话会有重复的答案,可以先把结果存在一个set里,最然把结果从set转存到vector里。代码如下。
1 class Solution { 2 public: 3 void findNext(vector<int> &num, int target, set<vector<int> > &res, vector<int> &v, int idx, int sum) { 4 if (sum > target || idx > num.size()) return; 5 if (sum == target) { 6 res.insert(v); 7 return; 8 } 9 v.push_back(num[idx]); 10 findNext(num, target, res, v, idx+1, sum+num[idx]); 11 v.pop_back(); 12 findNext(num, target, res, v, idx+1, sum); 13 } 14 15 vector<vector<int> > combinationSum2(vector<int> &num, int target) { 16 set<vector<int> > res; 17 vector<int> v; 18 sort(num.begin(), num.end()); 19 findNext(num, target, res, v, 0, 0); 20 vector<vector<int> > ret; 21 for (set<vector<int> >::iterator i = res.begin(); i != res.end(); ++i) { 22 ret.push_back(*i); 23 } 24 return ret; 25 } 26 };