39. 组合总和
medium
方法一:
class Solution {
public:
void dfs(vector<int>& candidates,int target,vector<vector<int>>& ans,vector<int>& combine,int idx){
if(idx==candidates.size()){
return;
}
if(target==0){
ans.emplace_back(combine);
return;
}
//直接跳过
dfs(candidates,target,ans,combine,idx+1);
//选择当前数
if(target-candidates[idx]>=0){
combine.emplace_back(candidates[idx]);
dfs(candidates,target-candidates[idx],ans,combine,idx);//每个数可以被重复使用
combine.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> combine;
dfs(candidates,target,ans,combine,0);
return ans;
}
};
//暴力
//https://leetcode-cn.com/problems/combination-sum/solution/di-39ti-ti-jie-hui-su-suan-fa-zu-he-zong-djvz/
注意每个数可以被重复使用
class Solution {
public:
vector<vector<int>> res;
vector<int> oneAns;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
//排序减少dfs搜索深度
sort(candidates.begin(),candidates.end());
dfs(candidates,target,0);
return res;
}
//回溯搜索所有答案,即:搜索空间树
void dfs(vector<int>& candidates,int target,int start){
if(target==0){
res.push_back(oneAns);
return;
}
//当<0时,不用加入
if(target<0) return;
//初始化i=start,避免重复答案->target=7,解为[2,2,3],[3,2,2]
for(int i = start;i<candidates.size();++i){
if(target>0){
oneAns.push_back(candidates[i]);
//元素可以重复使用,所以传递最后一个参数传i,不是i+1
dfs(candidates,target-candidates[i],i);
oneAns.pop_back();
}
}
}
};
//剪枝