[Leetcode] Combination Sum II
2015-03-16 22:05
323 查看
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
A solution set is:
记录当前idx之前的元素在结果中是否被使用,如果之前的与当前元素相等的元素没有被使用的话,那么这个元素也不应该被使用,这样就可以去重了。比如[1, 1, 2],如果第一个1没有被使用,那么第二个1也不能使用。
直接找的话会有重复的答案,可以先把结果存在一个set里,最然把结果从set转存到vector里。代码如下。
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,5and target
8,
A solution set is:
[1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
记录当前idx之前的元素在结果中是否被使用,如果之前的与当前元素相等的元素没有被使用的话,那么这个元素也不应该被使用,这样就可以去重了。比如[1, 1, 2],如果第一个1没有被使用,那么第二个1也不能使用。
class Solution { public: void findNext(vector<int> &num, int target, vector<vector<int> > &res, vector<int> &v, int idx, int sum, vector<bool> &flag) { if (sum > target || idx > num.size()) return; if (sum == target) { res.push_back(v); return; } bool fflag = false; for (int i = idx-1; i >= 0; --i) { if (num[i] == num[idx] && !flag[i]) { fflag = true; break; }; if (num[i] != num[idx]) break; } if (!fflag) { v.push_back(num[idx]); flag[idx] = true; findNext(num, target, res, v, idx+1, sum+num[idx], flag); flag[idx] = false; v.pop_back(); } findNext(num, target, res, v, idx+1, sum, flag); } vector<vector<int> > combinationSum2(vector<int> &num, int target) { vector<vector<int> > res; vector<bool> flag(num.size(), false); vector<int> v; sort(num.begin(), num.end()); findNext(num, target, res, v, 0, 0, flag); return res; } };
直接找的话会有重复的答案,可以先把结果存在一个set里,最然把结果从set转存到vector里。代码如下。
class Solution { public: void findNext(vector<int> &num, int target, set<vector<int> > &res, vector<int> &v, int idx, int sum) { if (sum > target || idx > num.size()) return; if (sum == target) { res.insert(v); return; } v.push_back(num[idx]); findNext(num, target, res, v, idx+1, sum+num[idx]); v.pop_back(); findNext(num, target, res, v, idx+1, sum); } vector<vector<int> > combinationSum2(vector<int> &num, int target) { set<vector<int> > res; vector<int> v; sort(num.begin(), num.end()); findNext(num, target, res, v, 0, 0); vector<vector<int> > ret; for (set<vector<int> >::iterator i = res.begin(); i != res.end(); ++i) { ret.push_back(*i); } return ret; } };
相关文章推荐
- LeetCode: Combination Sum II [039]
- leetcode:Combination Sum II
- [Leetcode]Combination Sum II@python
- Leetcode: Combination Sum II
- Leetcode:Combination Sum II
- LeetCode: Combination Sum II
- LeetCode – Refresh – Combination Sum II
- [LeetCode] Combination Sum II
- leetcode || 40、Combination Sum II
- LeetCode Combination Sum II
- [LeetCode] Combination Sum II
- [leetcode刷题系列]Combination Sum II
- 【LeetCode】Combination Sum II
- LeetCode40 - Combination Sum II
- [Leetcode]Combination Sum II
- [leetcode] Combination Sum II
- LeetCode Combination Sum II
- [leetCode] Combination Sum II
- leetcode Combination Sum II
- LeetCode-Combination Sum II