回溯法和DFS leetcode Combination Sum
代码:
个人浅薄的认为DFS就是回溯法中的一种,一般想到用DFS我们脑中一般都有一颗解法树,然后去按照深度优先搜索去寻找解。而分支界限法则不算是回溯,无论其是采用队列形式的还是优先队列形式的分支界限法。
下面这个函数就是我的DFS的函数,先介绍一下参数的含义,index表示当前要判断是否合适的candidates中的元素的下标,t表示即将要把新数据加入的位置。
1 void backTrace(int sum, int target, int a[], int index, int t, vector<int>& candidates) 2 { 3 if (sum == target) 4 { 5 vector<int> b; 6 for (int i = 0; i < t; i++) 7 { 8 b.push_back(a[i]); 9 } 10 sort(b.begin(),b.end()); 11 result.push_back(b); 12 } 13 if (sum>target) 14 { 15 return; 16 } 17 for (int i = index; i < candidates.size(); i++) 18 { 19 a[t] = candidates[i]; 20 backTrace(sum + candidates[i], target, a, i, t + 1, candidates); 21 } 22 }
这是很典型的深搜的题目了,我写回溯法特别容易出错,一个好的解决方法就是画出简易的、局部的解法树,然后根据解法树判断什么时候回溯,回溯的下一步是什么,回溯的逻辑关系是循环控制还是有其他方式控制(二叉树就是简单的左右控制),还有就是当前参数就是当前的数据源不能混。
哈哈哈哈!!!
这个题我也有改进技巧啦:
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 5 using namespace std; 6 7 8 vector<vector<int>> result; 9 int a[100]; 10 11 void backTrace(int sum, int target, int a[], int index, int t, vector<int>& candidates) 12 { 13 if (sum == target) 14 { 15 vector<int> b; 16 for (int i = 0; i < t; i++) 17 { 18 b.push_back(a[i]); 19 } 20 result.push_back(b); 21 } 22 if (sum>target) 23 { 24 return; 25 } 26 for (int i = index; i < candidates.size(); i++) 27 { 28 a[t] = candidates[i]; 29 backTrace(sum + candidates[i], target, a, i, t + 1, candidates); 30 if (candidates[i] + sum > target) 31 return; 32 } 33 } 34 35 vector<vector<int>> combinationSum(vector<int>& candidates, int target) 36 { 37 sort(candidates.begin(), candidates.end()); 38 backTrace(0, target, a, 0, 0, candidates); 39 return result; 40 } 41 42 int main() 43 { 44 vector<int> can = { 2, 3, 6, 7 }; 45 combinationSum(can, 7); 46 for (int i = 0; i < result.size(); i++) 47 { 48 for (int j = 0; j < result[i].size(); j++) 49 { 50 cout << result[i][j] << " "; 51 } 52 cout << endl; 53 } 54 }
改进点就是先对candidates进行从小到大的排序,然后就可以加上30~31的这行代码了,这个能减少不少无用的尝试,然后就是结果集,由于我们已经排好序了,且加入是从小到大所以,后来的就不需要排序了,直接添加就好了。少了第10行。
哈哈哈哈哈哈。。。。
我的一个小伙伴提供了一个思路,根据这个思路可以不用recursion,下面介绍一下,明天叫上代码:
先用target去减集合中的第一个元素然后在集合中寻找减的结果,如果有则作为一个成功的探索,如果没有继续减该元素然后继续寻找,直到减的结果小于零。再去尝试集合中的下一个元素。
转载于:https://www.cnblogs.com/chaiwentao/p/4500631.html
回溯法和DFS leetcode Combination Sum相关推荐
- LeetCode Combination Sum IV(动态规划)
问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...
- LeetCode Combination Sum
因为实验室项目好久没刷题了.从今天开始重新开始刷题. Given a set of candidate numbers (C) and a target number (T), find all un ...
- 【DFS】LeetCode 39. Combination Sum
LeetCode 39. Combination Sum Solution1: DFS,这个套路要熟记啊! class Solution { public:vector<vector<in ...
- 【动态规划】LeetCode 377. Combination Sum IV
LeetCode 377. Combination Sum IV Solution1: 我的未能AC的答案 题目描述的和前几道题差不多,但实际上不能用DFS来做(会超时),要用动态规划,还是记录一下吧 ...
- 【LeetCode】#39组合总和(Combination Sum)
[LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...
- 40. Combination Sum II 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
- 216. Combination Sum III
/** 216. Combination Sum III * 2016-6-12 by Mingyang* i一定要取到9,虽然大小聪明,想只取到7,但是后面的遍历可能也会遍历到9啊.* 1.长度标准 ...
- 36 数字组合(Combination Sum)
文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:数字组合(Combination Sum) 描述:给定一个候选数字的集合 ...
- LC39 Combination Sum
还是利用深搜的思想,注意一个元素可以取无数次.而LC40 Combination Sum II 就有次数限制,有次数限制的情况下可以先判断一个数是否与它前面的数相等,若相等则跳过该元素,直到找到一个数 ...
最新文章
- Eclipse中propedit插件安装(解决property中文问题)
- 1970.1.1这个特殊时间
- 阿里云服务器Svn-Server无法连接,阿里云服务器SVNServer配置
- TensorFlow机器学习实战指南之第一章
- JIAVA知识点整理
- TCP/IP之(四)Delay ack 和 Nagle算法
- Backbone.js源码解读(转载)
- 采用Docker集成jquery-file-upload组件到WEB应用
- 【测试】软件测试计划的编写
- mysql允许虚拟机访问权限_设置虚拟机安装的mysql访问权限及删除mysql
- java语言程序设计第三版电子书百度云_Java语言程序设计(基础篇)(原书第10版) 完整版 中文pdf扫描版[259MB]梁勇...
- 用计算机录制声音让音质更好,电脑有什么好用的录音软件吗
- 笨办法学python习题39-40
- oracle快照点,Oracle快照(snapshot)管理
- 如何为word增加页码,且第一页不显示页码?
- 内网穿透远程访问家里的群晖NAS 1-2
- 牛刀:中国房价的买点还没有…
- STM32音频频谱分析设计方案(程序+原理图+PCB)
- vb与oracle数据库连接,vb.net 如何与oracle数据库连接
- Speckle+IFC.js:开源BIM
热门文章
- 把「光」存储1小时,中科大新研究破世界纪录,保真度高达96.4% | Nature子刊
- Arm v9的牙膏挤出来了,超大核机器学习性能x2,小核4年来终于更新
- 超强平衡机器人,走钢丝、玩忍者步伐,还可以做瑜伽动作,不受干扰的那种 | IEEE 2020...
- 想在PyTorch里训练BERT,请试试Facebook跨语言模型XLM
- 基本算法系列15天速成
- iebook 发布到网站 独家秘诀
- 3、循序渐进设计模式-创建型
- Oracle 重做日志简介
- Controller的要求
- 【vs开发】向图形界面程序添加控制台