2022-08-08 15:44阅读: 27评论: 0推荐: 0

力扣-39-组合总和

直达链接

跟以往的回溯不太一样的是:

  1. 这里的出口条件不再是数组长度,而是数组元素和
  2. 参数数组中的元素可以被无限制重复选取
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;
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16562078.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(27)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起