力扣-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; }
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16562078.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步