leetcode - 39. 组合总和
给定一个无重复元素的数组 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. 组合总和相关推荐
- LeetCode 39 组合总和
LeetCode 39 组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.can ...
- leetcode 39. 组合总和 40. 组合总和 II
leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...
- LeetCode 39. 组合总和(排列组合 回溯)
1. 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...
- leetcode 39. 组合总和
执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...
- Leetcode 39 组合总和 (每日一题 20210806)
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合.candidates 中的数字可以 ...
- leetcode 39. 组合总和 思考分析
目录 1.题目 2.思考分析 3.未经优化代码 4.剪枝优化 1.题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
- leetcode —— 39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...
- LeetCode 39. 组合总和(回溯+剪枝)
题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...
- LeetCode 39:组合总和(Javascript 解答)
原题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回 ...
最新文章
- 树莓派 ROS 段错误
- linux 中断机制的处理过程
- 面试浅谈 c++ 的空间两级配置器
- 网络安全习惯_健康习惯,确保良好的网络安全
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
- 软件培训技术选哪个?
- linux Rh界面,Ubuntu Linux与RH系列的不同之处
- EasyRecovery如何恢复虚拟建模软件的数据文件
- 多元函数四则运算的一阶微分公式的存在性与性质
- 电脑wifi距离测试软件,wifi测速工具
- 中国游戏企业扬帆出海,应该选择怎样的云平台?
- element-ui按需引入报错 Error: Cannot find module ‘babel-preset-es2015‘
- mysql服务重启后不见了_Win10更新后,MySQL服务莫名消失的问题
- JavaScript-Tool:Moment.js
- java毕业生设计医院设备管理系统计算机源码+系统+mysql+调试部署+lw
- ps在html中的应用程序,Photoshop在网页设计中的应用与方法
- 证明四元数表示旋转的过程实部为0,虚部为罗德里格斯公式结果
- div随着屏幕滚动而滚动
- 【毕业季话题有奖征文】进击的技术er
- TMMi测试能力成熟度模型简介
热门文章
- [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
- 监听文件变化并自动运行 npm script
- 原创 TypeScript入门教程 之 迭代器
- Linux用一键安装包快速部署禅道项目管理平台
- 搭建Cockpit服务器,Linux集群管理工具,DevOps开发运维一体化集群系统/持续集成
- Kiwi浏览器 MIUI禁第三方广告 ADB停用系统应用
- Let‘s Encrypt 免费Https证书
- C#LeetCode刷题-递归
- 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。
- 系统操作手册_东芝CT操作手册——系统概述