给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
示例 1:
输入: candidates =[2,3,6,7],
target =7
, 所求解集为: [ [7], [2,2,3] ]
示例 2:
输入: candidates = [2,3,5],
target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
执行用时为8ms的范例:
class Solution {
public:
void find(vector<int>&candidates,vector<int>&temp,vector<vector<int>>&res,int sum,int level,int t)
{
if(sum==t) {res.push_back(temp); return;}
if(sum>t) return;
for(int i=level;i<candidates.size();i++)
{
temp.push_back(candidates[i]);
find(candidates,temp,res,sum+candidates[i],i,t);
temp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> temp;
vector<vector<int>> res;
int n=candidates.size();
if(candidates.size()==0) return res;
else find(candidates,temp,res,0,0,target);
return res;
}
};
我的解答(12ms):
class Solution {
public:
vector<vector<int> > combinationSum(vector<int>& candidates, int target)
{
sort(candidates.begin(),candidates.end());
vector<vector<int> > res;
vector<int> path;
int sum=0,k=0;
dfs(res,path,target,sum,candidates,k);
return res;
}
void dfs(vector<vector<int> >& res,vector<int>& path,int target,int sum,vector<int>& candidates,int k)
{
if(sum>target)
{
return;
}
if(sum==target)
{
res.push_back(path);
return;
}
while(k<candidates.size())
{
if(sum<target)
{
path.push_back(candidates[k]);
sum+=candidates[k];
dfs(res,path,target,sum,candidates,k);
sum-=candidates[k];
path.pop_back();
}
k++;
}
}
};
#开始回溯的时候忘记减去本轮candidates[k]了,找半天错误,脑子啊!!要经常练习预防老年痴呆了。。