![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法:回溯法
拾牙慧者
会点c++、python;
展开
-
leetcode 37. 解数独 思考分析
目录题目核心思路的不断细化1、核心框架2、考虑到每个位置的工作3、考虑到到达最后一列、该位置的数已经预置的情况4、判断是否符合规则的函数5、确定递归终止条件+确定函数返回值AC代码题目编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:1、数字 1-9 在每一行只能出现一次。2、数字 1-9 在每一列只能出现一次。3、数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。 一个数独。 .原创 2020-11-17 22:44:06 · 261 阅读 · 0 评论 -
leetcode 51. N 皇后 思考分析
目录题目思考AC代码题目n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。思考首先以N=4为例,画出解空间树的一部分:根据模板:void backtracking(参数){ if(终止条件) { 存放结果; return; } for(选择:本层集合中元素(树中结点孩子的数量就是集合的大小)) { 处理结点; backtracking(路径,选择列表); //递归 回溯,撤销处理结果; }}1、确.原创 2020-11-17 20:14:37 · 774 阅读 · 1 评论 -
leetcode 47. 全排列 II 思考分析
题目给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。思考分析以及代码这一题和前面的做过的两个题目有所关联:leetcode 46. 全排列 思考分析再加上leetcode 491. 递增子序列 思考分析类似的去重操作。先画出解空间树的图:红色部分才是真正意义上的去重:值相同的跳过。蓝色部分指的是我们用过的元素不能再用了。在组合问题中由于for循环进入下一层是i+1,所以本身就将用过的元素排除了。然而在排列问题中,我们可能要用到序号靠前且没有使用过的元素,所以原创 2020-11-12 11:43:17 · 230 阅读 · 0 评论 -
leetcode 46. 全排列 思考分析
目录1、题目2、思考3、优化1、题目给定一个 没有重复 数字的序列,返回其所有可能的全排列。2、思考老规矩,先画出给出的例子的解空间树:观察我们可以发现:1、深度向下一层深入时,出现过的元素不能再出现,我们能选择的只有没有选择过的元素,此处我用的哈希法set。2、结束条件是:同一个树枝上的结点个数>=nums数组的size().于是可以得到初步代码:注意这里判断元素是否出现过我用的set,后面会有优化class Solution {public: vector<.原创 2020-11-11 11:09:12 · 264 阅读 · 0 评论 -
leetcode 491. 递增子序列 思考分析
题目给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。说明:给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。思考这一题和leetcode 90. 子集 II 思考分析的思想有点像。但是需要注意的是:1、该数组是求递增子序列,所以不能打乱原数组的顺序。2、递增子序列3、递增子序列的长度最少是2其它的思想:回溯、去重其实和leetcode 90. 子集 II 思考分析原创 2020-11-10 10:50:06 · 236 阅读 · 0 评论 -
leetcode 90. 子集 II 思考分析
与本题相关联的题目解析:leetcode 78. 子集 思考分析leetcode 40. 组合总和 II思考分析题目给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。思考在文章 leetcode 40. 组合总和 II思考分析我们讲过去重的方法,分为树层去重和树枝去重。首先根据例子画出解空间树草图:观察发现,同一层重复取2就要过滤掉,同个树枝上是可以重复取相同元素的。这样就确定了去重条件,在层遍历的for循环中加入://.原创 2020-11-09 19:19:17 · 200 阅读 · 0 评论 -
leetcode 78. 子集 思考分析
题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。思考分析画出解空间树。我们可以发现我们所需要的结果是解空间的所有结点。而我们之前组合问题和分割问题都是收集树的叶子结点。所以我们只需要将每个结点放入结果中就行了class Solution {public: vector<vector<int>> result; vector<int> res; void backtra原创 2020-11-07 13:23:20 · 239 阅读 · 0 评论 -
leetcode 93. 复原IP地址 思考分析
题目给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。思考这一题和leetcode 131. 分割回文串 思考分析很像,都属于利用回溯法分割字原创 2020-11-05 16:39:15 · 347 阅读 · 0 评论 -
leetcode 131. 分割回文串 思考分析
题目给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。思考问题可以分为两个子问题:1、判断回文串2、分割数组判断回文串bool isPalindrome_string(string s,int startindex,int endindex){ for(int i = startindex,j = endindex;i<j;i++,j--) { if(s[i] != s[j]) return false;原创 2020-11-04 17:45:17 · 248 阅读 · 0 评论 -
leetcode 40. 组合总和 II 思考分析
题目给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。思考如果我们直接套用39题的思路,那么就会出现重复的组合。重复组合的产生,是因为集合中有重复的元素。去重,就是使用过的元素不能重复选取。我们result的重复组合的产生肯定是和重复元素有关的,我们从解空间树的深度(递归调用)和宽度(for循环)来看:1、元素的重复的影响可能出现在在解空间原创 2020-11-03 15:50:05 · 242 阅读 · 1 评论 -
leetcode 39. 组合总和 思考分析
目录1、题目2、思考分析3、未经优化代码4、剪枝优化1、题目给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。2、思考分析解空间树宽度部分即数组 candidates内集合,深度取决于target.一开始的重复元素理解错误了,每层循环都从0开始:for(int i=0;i<=candidates.size();i++)这样是不对的,原创 2020-11-03 11:23:29 · 157 阅读 · 0 评论 -
leetcode 17. 电话号码的字母组合 思考分析
题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。思考与递归程序解空间树的宽度是输入数字对应的字符的个数,深度是输入的数字的个数。确定回溯函数参数与之前leetcode 216. 组合总和 III 思考分析一样,我们需要建立两个全局变量,一个存放叶子结点子结果,一个用来存放所有子结果。参数:第一个是string digits(数字字符串),一个是int index.用index记录遍历第几个数字了原创 2020-11-02 20:40:34 · 216 阅读 · 0 评论 -
leetcode 216. 组合总和 III 思考分析
可能需要回顾的文章;leetcode 77. 组合 思考分析1、题目找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。2、递归这一题和之前一题很像:leetcode 77. 组合 思考分析终止条件有两个:sum==n && res.size() == k回溯的过程中加入对sum值的修改。修改一下递归函数的参数值,这样,本题就做好了class So.原创 2020-11-01 15:01:13 · 188 阅读 · 0 评论 -
leetcode 77. 组合 思考分析
目录1、题目2、回溯法思路3、参考其他思路,更深入了解这个问题可能需要回顾到的知识文章:1、常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)2、回溯法初步删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法1、题目给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。2、回溯法思路集合元素个数为n,由此可以看出解空间树每个结点有n孩子,深度为k。利用模板,就就就AC了。。。每次确定一个起点和一个终点.原创 2020-11-01 14:03:24 · 216 阅读 · 0 评论 -
回溯法初步
本文为参考公众号所做的笔记。代码随想录原文回溯法本质是穷举,穷举所有可能,然后选出我们想要的答案,所以它并不是一个高效的算法。但是由于有些问题本身能用暴力搜出来就不错了,所以回溯法也有很多的应用。回溯法解决的问题1、组合问题:N个数里面按一定规则找出k个数的集合2、排列问题:N个数按一定规则全排列,有几种排列方式3、切割问题:一个字符串按一定规则有几种切割方式4、子集问题:一个N个数的集合里有多少符合条件的子集5、棋盘问题:N皇后,解数独组合与排列区别:组合是不强调元素顺序的,排列是强调转载 2020-11-01 13:18:16 · 319 阅读 · 0 评论