力扣-39-组合总和
直达链接
跟以往的回溯不太一样的是:
- 这里的出口条件不再是数组长度,而是数组元素和
- 参数数组中的元素可以被无限制重复选取
class Solution {
public:
void backtrack(vector<vector<int>>& ret, vector<int>& candidates, int target, int sum,vector<int>& cur,int prev) {
if (sum == target) {
ret.push_back(cur);
}
else if (sum > target) {
return;
}
else {
for (int i = 0; i < candidates.size(); ++i) {
// prev字段主要是为了确保结果数组中都是递增的,以此达到去重的目的
if (candidates[i] >= prev) {
cur.push_back(candidates[i]);
sum += candidates[i];
backtrack(ret, candidates, target, sum, cur, candidates[i]);
sum -= candidates[i];
cur.pop_back();
}
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> cur;
backtrack(ret, candidates, target, 0, cur,0);
return ret;
}
};

回溯方法定义了很多的参数,总觉得不够优雅
accumulate()函数(包含numeric头文件),效果显著 ?!
void backtrack(vector<vector<int>>& ret, vector<int>& candidates, int target,vector<int>& cur,int prev) {
int sum = accumulate(cur.begin(), cur.end(), 0);
if (sum == target) {
ret.push_back(cur);
}
else if (sum > target) {
return;
}
else {
for (int i = 0; i < candidates.size(); ++i) {
// prev表示上一个插入cur的元素,这里希望能够使结果数组是(包含重复元素)递增的,以此达到去重的目的
if (candidates[i] >= prev) {
cur.push_back(candidates[i]);
backtrack(ret, candidates, target, cur, candidates[i]);
cur.pop_back();
}
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> cur;
backtrack(ret, candidates, target, cur,0);
return ret;
}


浙公网安备 33010602011771号