本题是不同于3sum和2sum 他没有限制构成目标个数,也没限制重复,这是我们只管感受是深度遍历+剪枝。
下面是代码:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>>res;
vector<int>mid;
sort(candidates.begin(),candidates.end());
dfs(candidates,res,mid,target,0,0);
return res;
}
这里的参数start是本次递归的关键,它控制了下一次递归的开始起点,这个开始起点是指在整个
candidates数组中,因为函数允许重复所以我们在当前和小于target的时候我们继续从当前的起点开
始下一次遍历,如果我们超过target返回,他会调用,pop_back函数,即弹出上次递归加入的数
字,然后起点+1。
void dfs(vector<int>& candidates,vector<vector<int>>&res,vector<int>&mid,int target,int cur,int start){
if(cur==target){
res.push_back(mid);
return;
}
if(cur>target)
return;
for(int k=start;k<candidates.size();k++){
mid.push_back(candidates[k]);
dfs(candidates,res,mid,target,cur+candidates[k],k);
mid.pop_back();
}
}