这道题是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;
}
};

提交结果:

个人总结:

本题的数据是可以重复的,可重复加深了答案的深度。还有我一开始没有对数据进行排序,导致一次错误,如果不排序的话,想要得出答案会很麻烦,剪枝步骤也会变得毫无意义,尤其是在大数据下,对数据进行先排序后处理,时间上的优势可以明显的表现出来。

最新文章

  1. 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长
  2. PostgreSQL installations
  3. C#链接阿里云KVStore
  4. 关于使用&quot;/&quot;来 dispatcherServlet 的url-pattern带来的问题
  5. 如何查看,关闭和开启selinux
  6. UITableViewCell Property “icon” cannot be found in forward class object “DJWeiBo”
  7. LeetCode46,47 Permutations, Permutations II
  8. mahout入门指南之基于mahout的itembased算法
  9. 【实验室笔记】C#以本地时间创建txt文件
  10. grunt学习随笔
  11. linux 下日常使用便利工具
  12. PTA 邻接表存储图的广度优先遍历(20 分)
  13. Android ListView中Item点击事件失效解决方案
  14. 《剑指offer》和为S的连续正数序列
  15. 分布式缓存技术之Redis_Redis集群连接及底层源码分析
  16. 12个敏捷过程的小提示Tips
  17. go defer笔记
  18. nodejs cannot find module &#39;mysql&#39; 问题分析
  19. The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
  20. Visual Studio 2012自动添加注释(如版权信息等)

热门文章

  1. android开发学习 ------- debug 和 release版本执行结果不同
  2. FTP上传下载 C#辅助类
  3. vue样式操作与事件绑定
  4. ES-windos环搭建-ik中文分词器
  5. codewars遇到的比较有意思的题目
  6. 【笨办法学Python】习题11:打印出改变了的输入
  7. Azure 进阶攻略 | 关于Java 和事件中心的那不得不说的事
  8. ubuntu16 安装elasticsearch6.3问题
  9. 自学Spring Boot
  10. java并发编程:Executor、Executors、ExecutorService