leetcode 39. Combination Sum(回溯算法)
题目内容
给定一组候选数字(没有重复)和一个目标数字,找出候选数字之和与目标数字相等的所有唯一组合。
同一候选数字可以重复出现多次。
注意:
- 所有数字都是正整数
- 解集不能包含重复组合
分析
应用回溯算法来进行求解
- 先对candidates排序
- 用一个vector代替栈来保存candidates的下标,用sum保存当前栈中的和
- 1)当sum小于target时,将candidates中下标为栈顶元素的值入栈(为了避免重复,入栈不能小于该值);2)当sum等于target时,将结果保存,出栈,然后判断栈顶元素是否已经是candidates最后一个元素了,如果是的话继续出栈,最后将栈顶元素加一(candidates下标后移);当sum大于target时,不保存结果,操作和2)相同。
- 最后返回结果
代码
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(回溯算法)相关推荐
- 【DFS】LeetCode 39. Combination Sum
LeetCode 39. Combination Sum Solution1: DFS,这个套路要熟记啊! class Solution { public:vector<vector<in ...
- leetcode 39. Combination Sum | 39. 组合总和(Java)
题目 https://leetcode.com/problems/combination-sum/ 题解 不是最优解法. 对于每一个位置 i 上 的元素,分为选或不选两种情况. 遍历每一个位置,计算强 ...
- 【动态规划】LeetCode 377. Combination Sum IV
LeetCode 377. Combination Sum IV Solution1: 我的未能AC的答案 题目描述的和前几道题差不多,但实际上不能用DFS来做(会超时),要用动态规划,还是记录一下吧 ...
- LeetCode笔记:39. Combination Sum
题目描述 给定一个无重复的正整数数组 candidates 和一个正整数 target, 求所有和为 target 的 candidates 中数的组合中.其中相同数的不同顺序组合算做同一种组合,ca ...
- 「leetcode」最强回溯算法总结篇!历时21天、画了20张树形结构图、14道精选回溯题目精讲
本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...
- 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...
一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...
- leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
题目 https://leetcode.com/problems/combination-sum-iii/ 题解 回溯法(back tracking)是一种选优搜索法.可以理解为通过选择不同的岔路口寻 ...
- leetcode 377. Combination Sum IV | 377. 组合总和 Ⅳ(动态规划)
题目 https://leetcode.com/problems/combination-sum-iv/ 题解 最近养成了上来直奔 Related Topics 的习惯- 确认过眼神,又是个 dp 问 ...
- 39. Combination Sum
description: 给定target, 求给定数列中找到几个数(其中的数可以重复使用,且一组数有几个也不做限制)的和为target Note: https://www.cnblogs.com/g ...
- 【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 ...
最新文章
- oracle数据库按照城市分组_大数据分组怎样才会更快
- 设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)
- PHP 获取当前类名、方法名、URL地址
- matelab的安装
- 给计算机图片文件夹加密码,电脑文件夹设置密码的方法是什么【图文】
- java排序算法之冒泡排序
- bootstrap 开源框架demo_5 个接私活必备的 Java 开源项目!
- 持续集成工具FinalBuilder使用心得
- 14 CO配置-控制-内部订单-维护定单编号范围
- 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
- sql中exists,Intersect ,union 与union All的用法
- 怎么取消打开文件的安全警告?
- 深入理解JMM(Java内存模型) --(三)顺序一致性
- 如何在Eclipse配置Tomcat
- tensorflow学习笔记(5)卷积神经网络(CNN)
- JavaScript—常见设计模式整理(27)
- 20191119每日一句
- 采用Turbo编码的图像传输试验(AWAG信道,matlab实现)分别验证了不同交织器类型,交织深度对turbo码性能的影响
- React Hook介绍(二):Effect Hook
- 网站被劫持的方式,和检测方法、网站被劫持、检测方法有哪些