![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯算法
文章平均质量分 64
回溯算法
辰阳星宇
这个作者很懒,什么都没留下…
展开
-
161、【动态规划】leetcode ——139. 单词拆分:回溯法+动态规划(C++版本)
当在s中下标为[i-1, j]时,有对应的单词在wordDict中并且前i-1个字符可被wordDcit组成时, 让dp[j] = true。为2,则应该得到为121才合法,如果得到的为112应不合法,不为我们的把目标。因此,这是一个考虑顺序的。取到s中第j个字符时,可以由wordDict所组成。背包为s字符串,物品为从当前0-j之间的字符。为了便于计算让dp[j] = true。因为需要考虑顺序问题,例如。,应该先背包再物品。原创 2023-02-15 18:26:05 · 191 阅读 · 0 评论 -
154、【动态规划】leetcode ——494. 目标和:回溯法+动态规划(C++/Python版本)
dp[j] += dp[j - nums[i]],装入nums[i]之前,容量为j - nums[i]时的方式个数dp[j - nums[i]],再加上装入nums[i]之后,容量为j时之前的方式个数dp[j],进而得到背包容量为j时,总的方式个数。dp[0] = 1,容量为0时,仅有一种方式可以成立,即选择数字0。本题中的数都为非负数,目标要求是选取组成正数的数和负数的数,让其和为。此时,正数最大为4,里面只有1,因此dp[j]长度为4。,因此我们就可以进行第一个判定,,一个是要组成负数的集合。原创 2023-02-11 14:34:33 · 479 阅读 · 0 评论 -
142、【回溯算法】leetcode ——37. 解数独:三维信息判定(C++版本)
(2)判定行是否有冲突,判定列是否有冲突,(1)按照9×9的for循环遍历,遇到。就判定是否可填充,如果可以则填充。(2)如何去确定填充符合要求?(1)按哪种方式去回溯遍历?原创 2023-02-05 21:16:34 · 122 阅读 · 0 评论 -
49、【图】N-皇后问题:二维信息判定(C/C++版)
题目描述n−皇后问题是指将 n 个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数 n。输出格式每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意,只要不重复且没有遗漏即原创 2021-04-29 18:48:29 · 1110 阅读 · 2 评论 -
【算法刷题】回溯算法题型及方法归纳
回溯法是一种以递归去遍历各种情况的搜索方式,搜索过程可抽象成遍历,遍历中会枚举所有情况,实际上就是一个暴力搜索的过程,有时候迭代遍历多层for循环做不出来的时候,可用回溯法做出来。原创 2023-01-30 21:55:25 · 1317 阅读 · 0 评论 -
126、【回溯算法】leetcode ——332. 重新安排行程:回溯算法(C++版本)
【代码】125、【回溯算法】leetcode ——332. 重新安排行程:回溯算法(C++版本)原创 2023-01-30 12:47:20 · 335 阅读 · 0 评论 -
125、【回溯算法】leetcode ——47.全排列 II:visited去重(C++版本)
的区别在于数组中的元素可能有重复元素,如果按原方式获取所有叶节点,那么会出现重复的结果。因此,需要此进行去重,而去重时候与。前者是遍历至某一在第一层遍历时候的树层,就可以去重。而后者,是对第一层之后的后续情况树枝去重。的区别在于,组合问题的每次需要指明起始下标,而排列问题每次都从头到尾选取符合要求的结果。第一次遍历1时,正常访问,第二次遍历第二个1时,由于会将第一个1回退导致。第一次,第二次,第三次都可正常遍历1。而在第一次中的后续情况中,由于。会导致后续第一个树枝可正常遍历,而第二个树枝会被剪去。原创 2023-01-29 17:32:59 · 216 阅读 · 0 评论 -
124、【回溯算法】leetcode ——46. 全排列(C++版本)
本题是排列问题与组合问题区别在于,排列问题是区分元素顺序的,同一个元素占据不同的位置,代表不一样的结果。而组合问题不区分元素顺序,同一个元素,只要在这个结果中无论占据那个位置都认为相同的。此题是排列的一般性问题,数组中无重复元素,不允许单个结果内有重复元素,但要求获取按不同顺序获取的数。来判定元素之前是否访问过,若访问过则访问其余元素。作为两个不同的结果,而组合对于。认为是通过一种结果。原创 2023-01-29 16:36:40 · 108 阅读 · 0 评论 -
123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)
的区别在于:(1)存储结果集判定条件;(2)输入数据的排列顺序;因为题中条件已经规定了nums的取值范围为。,故通过加上100的方式,把数映射到。此题也是子集问题,但和。中,共201个数值。原创 2023-01-28 19:54:17 · 394 阅读 · 0 评论 -
122、【回溯算法】leetcode ——90. 子集 II:子集去重(C++版本)
的区别在于,数组中可能会含有相同元素,可允许单个结果内有重复,但若还是获取所有树结点的话,会出现结果与结果之间有重复。因此,需要对会出现重复的结果进行去重。若大于且相同,则说明有重复元素,因在没有遍历到这个元素之前,已经将这一数字与其余数字的组合结果存储过,因此对于出现相同数字时,跳。原创 2023-01-28 12:09:00 · 140 阅读 · 0 评论 -
121、【回溯算法】leetcode ——78. 子集(C++版本)
子集问题获取每个结点方式,是在每层向下遍历前存取结点。,若把遍历过程看作一棵树,子集问题实际上就是。仅获取树中的叶子结点。原创 2023-01-28 11:10:32 · 123 阅读 · 0 评论 -
120、【回溯算法】leetcode ——93. 复原 IP 地址(C++/Python版本)
点够三个点,若全部为有效IP,则加入结果集,否则跳过。来判定划分的这段是否位有效IP。的长度增一,因此下次选择路径需从。为记录已经点取的小数点个数。中依次选取IP位来划分,使用。之前插入’.',因此传入为。本题是分割问题,思路与。为下一次遍历起始下标,为判定的IP位下标。原创 2023-01-27 23:16:05 · 266 阅读 · 0 评论 -
119、【回溯算法】leetcode ——131. 分割回文串:分割问题(C++版本)
本题为分割问题,分割问题类似于组合问题。组合问题是按某一顺序进行遍历,依次选取数组中的元素。而分割问题是按某一顺序进行切割,切割出一个数后,继续递归向下以相同的方式进行切割。不论是切割还是组合,本质上都是选择一个数,然后对于选择的数进行某种判断,判定是否加入结果当中,再继续向下遍历。回退时候,将加入的数弹出。原创 2023-01-27 21:36:09 · 114 阅读 · 0 评论 -
118、【回溯算法】leetcode ——40. 组合总和 II:回溯法+剪枝优化(C++/Python版本)
本题的特点是,一个允许结果中出现相同数字,但每个元素仅能被选取一次。结果与结果之间不允许有重复,需要去重。的相同之处在于结果中可能会含有重复元素,但结果与结果之间不能重复。不同之处在于,元素可能被选多次。的相同之处在于选取的元素都是只能被选一次,不同之处在于77里面没有重组元素。的关系大小,先去重会出现重复元素的结果,然后再让唯一情况加入结果集。时,说明已经遍历过前方的元素,正向后续遍历,若此时也出现。,则说明会出现重复情况,提前跳出该情况。时,说明此时刚开始遍历某一数字。表示某次遍历的首个元素,根据。原创 2023-01-26 18:04:11 · 410 阅读 · 0 评论 -
117、【回溯算法】leetcode ——39. 组合总和:回溯法+剪枝优化(C++/Python版本)
*剪枝优化:**让数组从小到大排列,当遍历到当前的数相加后,超过目标值,则可认为后序的数与之相加一定会不满足条件,直接退出。本题的重点是要保证结果与结果之间去重,且一个结果内可含数字。去重的方式便是设置下一回遍历的起始位置。,可保证后续再次遍历的结果不会出现之前遍历过的结果,而与。可保证不出现重复的数字,而本题起始位。可允许出现重复的数字。原创 2023-01-26 16:32:02 · 107 阅读 · 0 评论 -
116、【回溯算法】leetcode ——17. 电话号码的字母组合:回溯法:哈希映射+字符串数组映射(C++/Python版本)
将Hash表改用string数组,降低空间复杂度、提高了存储效率。用Hash表构建字符型数字和字母的映射关系。原创 2023-01-25 22:53:37 · 158 阅读 · 0 评论 -
115、【回溯算法】leetcode ——216.组合总和III:回溯法+剪枝优化(C++/Python版本)
其中,path.size():表示当前已存入的数,k - path.size():表示当前还可以再存几个数,n - (k - path.size()) + 1:表示当前最大的遍历起始位置。的判定条件,可以让每次传入数的时候进行。,与之不同的是,需要多一个相加和为。时,再将结果压入结果集中。整体回溯法思路类似于。,从而实现剪枝的过程。原创 2023-01-25 21:14:04 · 404 阅读 · 0 评论 -
114、【回溯算法】leetcode ——77. 组合:回溯法+剪枝优化(C++/Python版本)
作为每次遍历的起始值,每遍历完一种情况,该值加一,传入给下一层函数遍历。的顺序选择数,因此如出现如下图情况,其实可以在后续进行剪枝操作。组合问题是回溯法里的经典问题,分别采用两个全局变量。之后,由于要保证结果集里不重复,因此就一定不会再有。,即找到k个数的组合时,将其加入结果集。:表示当前最大的遍历起始位置。这四个数的选择中,当已经选择。:表示当前还可以再存几个数,,此时的起始位置范围一定为。时,最大的起始遍历位置为。时,最大的起始遍历位置为。,从而实现剪枝的过程。:表示当前已存入的数,原创 2023-01-20 19:48:32 · 750 阅读 · 0 评论 -
107、【树与二叉树】leetcode ——236. 二叉树的最近公共祖先:回溯法(C++版本)
自底向上的返回信息,采用后序遍历的方式。当从左孩子或右孩子中找到p或q,则返回这个结点。这个结点再想上传递给上面的结点。(1)p和q分别在左、右子树中,此时返回最近公共祖先结点;(2)p和q在同一侧子树中,此时谁为祖先结点返回谁。原创 2023-01-17 17:16:54 · 90 阅读 · 0 评论 -
99、【树与二叉树】leetcode ——113. 路径总和 II:回溯法两种版本(C++版本)
的,则输出,否则分别再向左子树、右子树探测。函数结尾时候,再把添加的这个结点。此方式是,每次判定出左子树或右子树为空时,就提前将该结果加入。此方式是,每次遍历时候,将当前结果添加到。当中,退出时候,再分别从退出口。存当前路径,设置一个。原创 2023-01-14 18:35:15 · 99 阅读 · 0 评论 -
98、【树与二叉树】leetcode ——112. 路径总和:5行精简代码回溯法[带剪枝]+迭代法(C++版本)
【代码】98、【树与二叉树】leetcode ——112. 路径总和:回溯法[带剪枝]+迭代法(C++版本)原创 2023-01-14 13:25:46 · 101 阅读 · 0 评论 -
97、【树与二叉树】leetcode ——513.找树左下角的值:层次遍历+回溯法(C++版本)
原题链接:513. 找树左下角的值要找到最底层的最左边元素,首先要确定深度最大的子树,然后找到其最左边的叶子结点(也就是最后一层的第一个结点)。层序遍历最适合解本题,因层序遍历是按成遍历,因此,最后一次遍历的一定为最后一层,记录遍历最后一层的第一个元素即为最底层的最左边叶子。二、递归法:回溯想要找到最后一层的最左端叶子,需要计算两个东西。第一,需要计算出最大深度,第二需要计算出最后一层的第一个叶子。设置一个记录最大深度,设置一个记录结果。若当前遍历的深度比之前已记录的最大深度更大,则记录当前的叶子结点原创 2023-01-14 12:40:49 · 101 阅读 · 0 评论 -
95、【树与二叉树】leetcode ——257. 二叉树的所有路径:递归法DFS/回溯法+迭代法DFS+层序遍历BFS(C++版本)
【代码】95、【树与二叉树】leetcode ——257. 二叉树的所有路径:递归法DFS/回溯法+迭代法DFS+层序遍历BFS(C++版本)原创 2023-01-13 17:25:06 · 98 阅读 · 0 评论