思路:
同样回溯模板题
储备:
问题重点:
1、注意剪枝的位置的区别。
2、先写循环体,再去补充你要写的那些东西。按照你的思路来。
递归的参数也可以后面慢慢加。需要了再加。
3、
此外还定义了int型的sum变量来统计单一结果path里的总和,其实这个sum也可以不用,用target做相应的减法就可以了,最后如何target==0就说明找到符合的结果了,但为了代码逻辑清晰,依然用了sum。
最后:
放在for循环剪枝,避免进入多一层递归。需要提前排序一下:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
int sum=0;
void trace(vector<int>& candidates, int target, int idx, int sum) {
// if (sum>target) return ;//剪枝.也可以放在for循环里面剪
if (sum==target) {
res.push_back(path);
return ;
}
for (int i=idx;i<candidates.size() && sum+candidates[i]<=target;i++) {
sum+=candidates[i];
path.push_back(candidates[i]);
trace(candidates,target,i,sum); //可以重复读取,不用+1.每层递归把上一层的排除在集合之外
sum-=candidates[i];
path.pop_back();
}
return ;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());//放在for循环里剪枝需要排序
trace(candidates, target, 0, sum);
return res;
}
};
放在外面剪枝:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
int sum=0;
void trace(vector<int>& candidates, int target, int idx, int sum) {
if (sum>target) return ;//剪枝.也可以放在for循环里面剪跳过递归更优化
if (sum==target) {
res.push_back(path);
return ;
}
for (int i=idx;i<candidates.size();i++) {
sum+=candidates[i];
path.push_back(candidates[i]);
trace(candidates,target,i,sum); //可以重复读取,不用+1.每层递归把上一层的排除在集合之外
path.pop_back();
sum-=candidates[i];
}
return ;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
trace(candidates, target, 0, sum);
return res;
}
};

1141

被折叠的 条评论
为什么被折叠?



