問題詳情
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.
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]
]
問題分析及思路
這道題有一種最簡單的做法就是將所有的子集全部求和並與其對比,但是這樣的計算量過大!下面使用遞歸,可以減小計算量。
需要注意的是如果有相同的數,且有解爲使用了兩個及以上的相同的數,則只能有一次計數,這次計數以第一個該數字爲基準。防止重複。
具體代碼
class Solution {
public:
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end());
vector<vector<int> > ret;
vector<int> cur;
Find(ret, cur, num, target, 0);
return ret;
}
void Find(vector<vector<int> > &ret, vector<int> cur, vector<int> &num, int target, int position)
{
if(target == 0)
ret.push_back(cur);
else
{
for(int i = position; i < num.size() && num[i] <= target; i ++)
{
if(i != position && num[i] == num[i-1])
continue;
cur.push_back(num[i]);
Find(ret, cur, num, target-num[i], i+1);
cur.pop_back();
}
}
}
};