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] ]
Subscribe to see which companies asked this question
中间过程用set保证唯一性,结果进行一次转换。
static int m[100];
class Solution {
public:
void backtrack(vector<int>& can,const int target,vector<int> temp,int t,int tempSum,set<vector<int>>& s1)
{
if(tempSum==target)
{
sort(temp.begin(),temp.end());
if(s1.find(temp)==s1.end())
{
s1.insert(temp);
}
return ;
}
else
{
for(int i=t+1;i<can.size();++i)
{
if(m[i]==0&&(tempSum+can[i])<=target)
{
m[i]=1;
temp.push_back(can[i]);
backtrack(can,target,temp,i,tempSum+can[i],s1);
temp.pop_back();
m[i]=0;
}
}
return ;
}
}
vector<vector<int>> combinationSum2(vector<int>& can, int target) {
vector<int> temp;
set<vector<int>> s1;
for(int i=0;i<can.size();++i)
{
if(can[i]<=target)
{
m[i]=1;
temp.push_back(can[i]);
backtrack(can,target,temp,i,can[i],s1);
temp.pop_back();
m[i]=0;
}
}
return vector<vector<int>>(s1.begin(),s1.end());
}
};