题目内容

给定一组候选数字(没有重复)和一个目标数字,找出候选数字之和与目标数字相等的所有唯一组合。

同一候选数字可以重复出现多次。

注意:

  1. 所有数字都是正整数
  2. 解集不能包含重复组合

分析

应用回溯算法来进行求解

  1. 先对candidates排序
  2. 用一个vector代替栈来保存candidates的下标,用sum保存当前栈中的和
  3. 1)当sum小于target时,将candidates中下标为栈顶元素的值入栈(为了避免重复,入栈不能小于该值);2)当sum等于target时,将结果保存,出栈,然后判断栈顶元素是否已经是candidates最后一个元素了,如果是的话继续出栈,最后将栈顶元素加一(candidates下标后移);当sum大于target时,不保存结果,操作和2)相同。
  4. 最后返回结果

代码

class Solution {
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());vector<vector<int>> rtn;if(candidates.size() == 0) return rtn;vector<int> conbination_stack; //保存下标conbination_stack.push_back(0);int sum = candidates[0];while(conbination_stack.size() != 0) {if(sum < target) {conbination_stack.push_back(conbination_stack[conbination_stack.size() - 1]);sum = sum + candidates[conbination_stack[conbination_stack.size() - 1]];}else {if(sum == target) {vector<int> temp;for(int i = 0; i < conbination_stack.size(); i++) {temp.push_back(candidates[conbination_stack[i]]);}rtn.push_back(temp);}sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]];conbination_stack.pop_back();while(conbination_stack.size() != 0 && conbination_stack[conbination_stack.size() - 1] == candidates.size() - 1) {sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]];conbination_stack.pop_back();}if(conbination_stack.size() != 0) {sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]] + candidates[conbination_stack[conbination_stack.size() - 1] + 1];conbination_stack[conbination_stack.size() - 1]++;}}}return rtn;}
};

总结

感觉我的代码还是没有达到最优,在入栈出栈的判断上应该还能改进,代码中间如果有不足的地方还望大佬指正!

leetcode 39. Combination Sum(回溯算法)相关推荐

  1. 【DFS】LeetCode 39. Combination Sum

    LeetCode 39. Combination Sum Solution1: DFS,这个套路要熟记啊! class Solution { public:vector<vector<in ...

  2. leetcode 39. Combination Sum | 39. 组合总和(Java)

    题目 https://leetcode.com/problems/combination-sum/ 题解 不是最优解法. 对于每一个位置 i 上 的元素,分为选或不选两种情况. 遍历每一个位置,计算强 ...

  3. 【动态规划】LeetCode 377. Combination Sum IV

    LeetCode 377. Combination Sum IV Solution1: 我的未能AC的答案 题目描述的和前几道题差不多,但实际上不能用DFS来做(会超时),要用动态规划,还是记录一下吧 ...

  4. LeetCode笔记:39. Combination Sum

    题目描述 给定一个无重复的正整数数组 candidates 和一个正整数 target, 求所有和为 target 的 candidates 中数的组合中.其中相同数的不同顺序组合算做同一种组合,ca ...

  5. 「leetcode」最强回溯算法总结篇!历时21天、画了20张树形结构图、14道精选回溯题目精讲

    本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...

  6. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  7. leetcode 216. Combination Sum III | 216. 组合总和 III(Java)

    题目 https://leetcode.com/problems/combination-sum-iii/ 题解 回溯法(back tracking)是一种选优搜索法.可以理解为通过选择不同的岔路口寻 ...

  8. leetcode 377. Combination Sum IV | 377. 组合总和 Ⅳ(动态规划)

    题目 https://leetcode.com/problems/combination-sum-iv/ 题解 最近养成了上来直奔 Related Topics 的习惯- 确认过眼神,又是个 dp 问 ...

  9. 39. Combination Sum

    description: 给定target, 求给定数列中找到几个数(其中的数可以重复使用,且一组数有几个也不做限制)的和为target Note: https://www.cnblogs.com/g ...

  10. 【DFS】LeetCode 40. Combination Sum II

    Solution1:我的答案 同39题.DFS时间复杂度O(2n)O(2n)O(2^n),空间复杂度O(kn)O(kn)O(kn),k是最终答案的数量,n是元素个数 去重,用set,比较偷懒的做法 c ...

最新文章

  1. oracle数据库按照城市分组_大数据分组怎样才会更快
  2. 设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)
  3. PHP 获取当前类名、方法名、URL地址
  4. matelab的安装
  5. 给计算机图片文件夹加密码,电脑文件夹设置密码的方法是什么【图文】
  6. java排序算法之冒泡排序
  7. bootstrap 开源框架demo_5 个接私活必备的 Java 开源项目!
  8. 持续集成工具FinalBuilder使用心得
  9. 14 CO配置-控制-内部订单-维护定单编号范围
  10. 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
  11. sql中exists,Intersect ,union 与union All的用法
  12. 怎么取消打开文件的安全警告?
  13. 深入理解JMM(Java内存模型) --(三)顺序一致性
  14. 如何在Eclipse配置Tomcat
  15. tensorflow学习笔记(5)卷积神经网络(CNN)
  16. JavaScript—常见设计模式整理(27)
  17. 20191119每日一句
  18. 采用Turbo编码的图像传输试验(AWAG信道,matlab实现)分别验证了不同交织器类型,交织深度对turbo码性能的影响
  19. React Hook介绍(二):Effect Hook
  20. 网站被劫持的方式,和检测方法、网站被劫持、检测方法有哪些

热门文章

  1. CMake中include指令介绍
  2. 79ECharts:基础知识与问题解决
  3. [洛谷P4720] [模板] 扩展卢卡斯
  4. 深浅拷贝和数列,变量的区别
  5. mouseover与mouseenter、 mouseout与mouseleave的区别
  6. 正则表达式学习(一)
  7. ICLR 审稿人:这篇论文在标签平滑和知识蒸馏的关系上取得了重大突破!
  8. 【Pre-Training】XLNet:预训练最强,舍我其谁
  9. 【python】os 模块使用笔记
  10. 福利来了!本人近300G的学习资料愿与大家分享