给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]

示例 2:

输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————
解题思路:通过回溯法进行解答,建立一个树状图,基于深度遍历找到所有合适的路径,但是得注意题目要求说解集不能包含重复的组合,因此对于示例1来说,[2,2,3]和[2,3,2]是一样的,所以在代码中得想办法把会重复出现的情况进行剪枝去掉。这里参考leetcode中解题牛人liweiwei的图解


如下图所示,为了去除重复的集合,可以先将candidate从小到大进行排序,然后用一个变量index标记当前索引到的candidate中的值,这样可以避免在下一次递归回溯的过程中使用到比当前candidate[i]更小的值,这样就可以避免出现重复的集合。

我们通过代码来解释一下怎么去掉结果中可能会重复出现的集合。其C++代码如下:

class Solution {private:vector<vector<int>> num;  # 用于存储和为target的所有集合vector<int> sum;  # 用于存储每一次深度遍历得到的结果int i = 0;  # 用于去除可能重复出现的集合
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());  # 为了避免出现重复的集合,先对candidate进行排序,从小到大function(candidates,target,sum,i);  # 整体使用递归回溯return num;}void function(vector<int>& candidate, int target,vector<int> sum,int i){if(target==0)  # 如果target值为零,表示找到符合题目要求的集合{num.push_back(sum);   # 将符合要求的集合返回到二维数组sum中}        for(;i<candidate.size();++i)  # 遍历从当前索引i到candidate.size()的所有情况,同时不遍历0到i所指向的值,这样可以避免出现重复的值{if(candidate[i]<=target)  # 加快递归速度{sum.push_back(candidate[i]);  # 考虑从i到condidate.size()的每一种情况function(candidate,target-candidate[i],sum,i);sum.pop_back();  # 进行回溯,返回前一个状态}}}
};

leetcode - 39. 组合总和相关推荐

  1. LeetCode 39 组合总和

    LeetCode 39 组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.can ...

  2. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  3. LeetCode 39. 组合总和(排列组合 回溯)

    1. 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...

  4. leetcode 39. 组合总和

    执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...

  5. Leetcode 39 组合总和 (每日一题 20210806)

    给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合.candidates 中的数字可以 ...

  6. leetcode 39. 组合总和 思考分析

    目录 1.题目 2.思考分析 3.未经优化代码 4.剪枝优化 1.题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...

  7. leetcode —— 39. 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...

  8. LeetCode 39. 组合总和(回溯+剪枝)

    题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...

  9. LeetCode 39:组合总和(Javascript 解答)

    原题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回 ...

最新文章

  1. 树莓派 ROS 段错误
  2. linux 中断机制的处理过程
  3. 面试浅谈 c++ 的空间两级配置器
  4. 网络安全习惯_健康习惯,确保良好的网络安全
  5. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
  6. 软件培训技术选哪个?
  7. linux Rh界面,Ubuntu Linux与RH系列的不同之处
  8. EasyRecovery如何恢复虚拟建模软件的数据文件
  9. 多元函数四则运算的一阶微分公式的存在性与性质
  10. 电脑wifi距离测试软件,wifi测速工具
  11. 中国游戏企业扬帆出海,应该选择怎样的云平台?
  12. element-ui按需引入报错 Error: Cannot find module ‘babel-preset-es2015‘
  13. mysql服务重启后不见了_Win10更新后,MySQL服务莫名消失的问题
  14. JavaScript-Tool:Moment.js
  15. java毕业生设计医院设备管理系统计算机源码+系统+mysql+调试部署+lw
  16. ps在html中的应用程序,Photoshop在网页设计中的应用与方法
  17. 证明四元数表示旋转的过程实部为0,虚部为罗德里格斯公式结果
  18. div随着屏幕滚动而滚动
  19. 【毕业季话题有奖征文】进击的技术er
  20. TMMi测试能力成熟度模型简介

热门文章

  1. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
  2. 监听文件变化并自动运行 npm script
  3. 原创 TypeScript入门教程 之  迭代器
  4. Linux用一键安装包快速部署禅道项目管理平台
  5. 搭建Cockpit服务器,Linux集群管理工具,DevOps开发运维一体化集群系统/持续集成
  6. Kiwi浏览器 MIUI禁第三方广告 ADB停用系统应用
  7. Let‘s Encrypt 免费Https证书
  8. C#LeetCode刷题-递归
  9. 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。
  10. 系统操作手册_东芝CT操作手册——系统概述