【LeetCode】Combination Sum(组合总和)
这道题是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] ]
首先一看到题目我能想到的就是递归,但感觉递归太简单实现了,而且递归函数参数多(想起八皇后问题),想试试别的方法,一看评论区,绝大多数都是回溯剪枝法,递归法,DFS。其实一看代码其实这三种方法几乎一样。
示例二图:
当总和大于等于8时,就可以剪枝了,也就是说后面已经没有了答案。
解题代码:
class Solution {
public:vector<vector<int>> res;vector<int> ans;void getres(vector<int>& candidates,int target,int k,vector<int> ans){int size=candidates.size();for(int i=k;i<size;i++){if(target-candidates[i]>0){ans.push_back(candidates[i]);getres(candidates,target-candidates[i],i,ans);ans.pop_back();}else if(target-candidates[i]<0){return;}else{ans.push_back(candidates[i]);res.push_back(ans);ans.pop_back();return;}}return;}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());getres(candidates,target,0,ans);return res;}
};
然后想优化代码,优化就是为了剪枝,缩短运行时间。以下是优化结果,但是运行结果是错的。原因在于我之前写的代码已经具备的剪枝的效果,我后面这样写画蛇添足了。
class Solution {
public:vector<vector<int>> res;vector<int> ans;bool getres(vector<int>& candidates,int target,int k,vector<int> ans){int size=candidates.size();for(int i=k;i<size;i++){if(target-candidates[i]>0){ans.push_back(candidates[i]);if(getres(candidates,target-candidates[i],i,ans)){ans.pop_back();return false;}ans.pop_back();}else if(target-candidates[i]<0){return true;}else{ans.push_back(candidates[i]);res.push_back(ans);ans.pop_back();return false;}}return false;}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());getres(candidates,target,0,ans);return res;}
};
提交结果:
个人总结:
本题的数据是可以重复的,可重复加深了答案的深度。还有我一开始没有对数据进行排序,导致一次错误,如果不排序的话,想要得出答案会很麻烦,剪枝步骤也会变得毫无意义,尤其是在大数据下,对数据进行先排序后处理,时间上的优势可以明显的表现出来。
转载于:https://www.cnblogs.com/1000sakura/p/10743306.html
【LeetCode】Combination Sum(组合总和)相关推荐
- 39. Combination Sum 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- Leetcode39.Combination Sum组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- 【LeetCode】#39组合总和(Combination Sum)
[LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...
- LeetCode Combination Sum IV(动态规划)
问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...
- leetcode系列--40.组合总和 II
leetcode系列–第40题.组合总和 II 给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合 ...
- leetcode系列--39.组合总和
leetcode系列–第39题.组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 ...
- leetcode系列--216.组合总和 III
leetcode系列–第216题.组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字.说明:所有数字都是正整数.解集不 ...
- leetcode算法题--组合总和
原题链接:https://leetcode-cn.com/problems/combination-sum/ 1.回溯 class Solution {public:vector<vector& ...
- LeetCode Combination Sum
因为实验室项目好久没刷题了.从今天开始重新开始刷题. Given a set of candidate numbers (C) and a target number (T), find all un ...
- 【leetcode】377. 组合总和 Ⅳ(combination-sum-iv)(DP)[中等]
链接 https://leetcode-cn.com/problems/combination-sum-iv/ 耗时 解题:37 min 题解:41 min 题意 给你一个由 不同 整数组成的数组 n ...
最新文章
- PAT(甲级)2020年秋季考试 7-4 Professional Ability Test
- OpenGL 帧缓冲区
- python的编译器有哪些-python的编译器有哪些
- servlet 源码分析
- 4.1_ 1_ 初识文件管理
- 多目标函数 matlab 粒子群_【LIBSVM】基于群智能优化算法的支持向量机 (SVM) 参数优化...
- .net core 获取机器码_.NET Core 反射获取所有控制器及方法上特定标签
- 【笔试/面试】—— 二叉树的深度和宽度
- ubuntu 下安装 phpmyadmin 过程记录
- 面试官:给我说说你对Java GC机制的理解?
- 程序设计入门c语言代码,C语言程序设计 入门源代码代码集合
- 使用WIFI通讯,手机秒变单片机大屏显示器
- 2022年医院三基考试药师(中医临床)考试模拟试题卷及答案
- 详解网易AI布局,三大AI产品矩阵浮出水面
- C++系列(关键字static)
- singleton模式 C++
- WARN Error while fetching metadata with correlation id 5 : {testtopic=LEADER_NOT_AVAILABLE}
- etal斜体吗 参考文献_参考文献方面毕业论文格式模板,与文下载****北京化工大学学报相关论文下载...
- 代谢组+基因组联合分析
- 亲测有效IEEE数据库论文免费下载