![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode回溯
文章平均质量分 71
岗岗ganggang
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 36. 二叉搜索树与双向链表python
题目描述:题解:参考力扣二叉搜索树的中序遍历结果就是按找从小到大排列,在对二叉搜索树进行中序遍历的同时,确定left right指针位置。1.创建一个pre节点,初始化为None。2.定义dfs函数,输入cur节点:<1>对cur.left调用dfs。<2>处理cur节点,如果此时pre为None,说明当前cur为head节点,将cur保存在head中。 否则,pre为cur在生成的链表中的前一个节点,pre.right=cur cu...原创 2021-12-08 20:58:36 · 111 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径python
题目描述:题解:回溯1.path记录当前路径,result保存所有符合要求的路径。2.如果输入root为空,则直接返回,否则将root.val加入path,从target中减掉root.val,如果此时root为叶子结点并且target=0,则将path加入result,否则对root的左右子节点调用dfs,然后进行回溯(path中删除root.val,target加上,root.val值)class Solution: def pathSum(self, roo...原创 2021-12-08 09:46:47 · 169 阅读 · 0 评论 -
leetcode 1034. 边界着色 python
题目描述:题解:回溯思路:先将[row,col]的所有连通位置都染色为color,然后再将其中不为边界的部分,重新赋值为原来grid[row][col]的值。1.oricolor记录原始[row,col]位置的颜色,directions记录上下左右的移动方式,visited记录哪些位置被染色。2.dfs函数输入为posx,posy,visited,oricolor,如果[posx,posy]位置合法并且grid[posx][posy]=oricolor,则将grid[posx][..原创 2021-12-07 17:20:58 · 141 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围python
题目描述:题解:回溯题目要求从坐标[0,0]到坐标[m-1,n-1]中,从[0,0]开始,每次可以向左右上下四个方向移动,如果坐标[i,j]的所有数位之和大于k,则机器人无法进入[i,j],求出机器人可以到达的坐标数量。以m = 2, n = 3, k = 1为例,可以进入3个坐标,[0,0] [0,1] [1,0]1.设置visited数组,初始化为全0,记录位置[i,j]是否被访问过。2.dfs函数中,以坐标[posx,posy]和k为参数,如果[posx,posy]不在...原创 2021-12-07 10:26:22 · 151 阅读 · 0 评论 -
leetcode51. N 皇后python
题目描述:思路:1.n皇后问题,要求任意两个皇后不能处在一行,一列,一条斜线上。2.n皇后问题一个有效的解,必定是每一行放置一个皇后,只有这样才满足不冲突的最基本要求,因此此题可以转换为从第一行开始,从可选的n个列中选择一个合适的位置放置当前的皇后,然后再到下一行,为下一个皇后选择放置位置。3.为了确定一个新位置可不可以放置Q,需要记录当前已经确定的Q的位置。回溯过程:题解:参考LeetCode-51.N皇后,Python的回溯法实现及详细讲解_甘如荠-.原创 2021-11-11 16:40:43 · 466 阅读 · 0 评论 -
leetcode22. 括号生成
题目描述:题解:参考https://segmentfault.com/a/11900000221100821.设计一个递归函数helper(left,right,mystr,res) left表示剩余左括号数量,right表示剩余右括号数量,mystr表示当前找到的一种组合方式,res保存所有可能结果 left right均为0时说明找到了一种组合,mystr加入res中 left>0,mystr中添加一个左括号,传入新的left值和新的mystr进行递归 ...原创 2021-05-26 11:13:31 · 61 阅读 · 0 评论 -
leetcode 784. 字母大小写全排列 python
题目描述:题解:回溯DFS思路其实很简单1.result保存最终结果,currs记录当前路径上得到的字符串,idx表示当前匹配到s的位置。2.从输入s的第一个字符开始,如果当前对应字符是字母,则可以按照大小写两种情况拼街到currs中,否则直接把s[idx]加入即可。3.因为采用字符串拼接的方式,不需要回溯的过程。以a1b2为例:class Solution(object): def letterCasePermutation(self, s):原创 2021-11-10 19:01:56 · 445 阅读 · 0 评论 -
leetcode17. 电话号码的字母组合
题目描述:题解:1.用map digtostr保存每个数字对应的字符2.输入digits中有diglen个数字,result保存组合结果初始化为空3.对digits中每个数字找到对应字符,当处理第一个数字时,将数字对应字符保存在result,处理后续数字时,将字符保存在str_list4.将result中每个元素与str_list组合保存在tmp中,并对result更新5.算法主要思想是随着数字的读取不断更新resultdef letterCombinations(se原创 2021-05-25 10:47:53 · 125 阅读 · 0 评论 -
leetcode 79. 单词搜索 python
题目描述:题解:回溯参考LeetCode 79 Word Search (Python) - 小明MaxMing1.定义函数dfs,输入为一个坐标(posx,posy),需要匹配的字符串s和当前已经匹配到的下标idx,如果idx=len(s)说明已经完成了匹配,返回true,如果(posx,posy)超出界限或者与下一个需要匹配的s中的字符不同则返回,否则对当前位置的上下左右四个相邻位置调用dfs。2.对输入board的每个位置进行搜索,如果找到一个位置与s第一个字符相等则...原创 2021-11-08 17:23:08 · 564 阅读 · 1 评论 -
leetcode 130. 被围绕的区域 python
题目描述:题解:这道题是学习回溯算法的时候刷到的,但其实感觉还是DFS的方法解决。题目要求将所有被X包围的O改为O,被包围的部分不会属于边界,所以也就是将除了边界处O或与边界处O相连的部分外(相连的定义是上下左右四个方向),全部的O改为X。1.定义一个DFS函数,输入为一个坐标(x,y),如果该位置对应的是O则将其标记为M,然后对其上下左右四个位置调用DFS。2.对输入board的四个边界的每个位置调用DFS函数。3.此时已经将所有不需要更改的O标志为了M,然后再对boa..原创 2021-11-07 12:36:33 · 381 阅读 · 0 评论 -
leetcode 200. 岛屿数量python
题目描述:题解:DFS是在学习回溯算法的时候遇到的这道题,但其实就是DFS的思想。本来想通过在回溯的过程中,根据每个节点的周围节点为0和1的数量,判断该节点属于一个之前搜索过的大岛屿还是属于一个新的岛屿,但是好像不太可行。基本思路:对输入的grid依次进行搜索,如果遇到一个grid[i][j]=='1',说明该位置对应一个岛屿或者处在一个大岛屿中,岛屿数量加一,对该位置上下左右四个位置进行DFS,将为1的节点全都设为0,避免重复计算。class Solution(obj..原创 2021-11-05 16:27:10 · 195 阅读 · 0 评论 -
leetcode 733. 图像渲染 python
题目描述:题解 :从给定的坐标[sr,sc]开始,判断其上下左右四个位置原来的颜色是否与[sr,sc]相同,相同则将其染成新的颜色,然后再以该位置为起点,判断其周围四个位置。可以采用深度优先和广度优先梁总方法。参考:https://segmentfault.com/a/1190000023648280题解一:深度优先搜索如果image[sr,sc]值和newColor相等,则不用做任何处理。1.将给定位置的初始颜色记录为oricolor,防止之后被更改为newColo原创 2021-10-09 16:39:17 · 209 阅读 · 0 评论 -
leetcode 93. 复原 IP 地址 python
题目描述:题解:(参考leetcode评论区回答)1.和之前的回溯算法解决组合排列问题相同,res记录最终结果,path记录当前搜索路径,当s中所有字符都被使用并且path找到四个有效部分时,将path加入res。2.不同于之前的组合排列问题,每次选择一个值加入path,此题中每次向path添加的内容可以是当前可用字符串s的前1-3个字符。3.从s中剔除已经被使用的部分,s只保存可以使用的部分。4.每次判断选择加入的部分是否满足不包含先导0和在0-255的范围的条件,不...原创 2021-11-05 11:28:26 · 248 阅读 · 0 评论 -
leetcode 60. 排列序列 python
题目描述:题解一:回溯 超时1.和之前的利用回溯解决排列组合的问题思路类似。2.为了减少运行时间,只搜索前k种组合(通过当前res中组合的数量控制)3.返回值是str形式,需要加一步处理。class Solution(object): def getPermutation(self, n, k): res = [] depth = 0 used = [0 for i in range(n)] nums =.原创 2021-11-04 17:25:59 · 144 阅读 · 0 评论 -
leetcode 90. 子集 II python
题目描述:题解:回溯1.res保存最终结果,path保存当前搜索路径。2.为避免无效搜索,下一层搜索的开始节点为当前层搜索节点的下一个,比如上图中,1加入path后,下一层从2开始。3.因为输入数组存在重复数字,为了避免重复搜索,先对输入数组nums进行排序,相同的数字放在一起,如果nums[i]与nums[i-1]相等,并且nums[i-1]在同一层已经被展开搜索过,则不对nums[i]进行搜索。4.在将path加入res的时候需要判断path是否已经在res中存在,否则re.原创 2021-11-04 15:56:52 · 163 阅读 · 0 评论 -
leetcode 78. 子集 python
题目描述:题解:回溯1.类似于leetcode77. 组合python_ganggang的博客-CSDN博客2.res保存最终结果,path记录当前搜索路径,每次将path添加到res中。3.为了避免重复组合下一层搜索从下一个位置开始,此题也同样不需要used数组记录使用情况。class Solution(object): def subsets(self, nums): res = [] used = [0 for i in rang.原创 2021-11-04 10:54:07 · 148 阅读 · 0 评论 -
leetcode77. 组合python
题目描述:题解:1.按照题目给出的示例,相同数字按照不同顺序的排列组合看作一个。2.题目中示例1的搜索过程如下:3.实现思路:<1>设置一个nums数组,共有n+1个数字,从0-n<2>设置一个used数组,n+1个数字,初始化为全0,记录nums[i]是否已经被搜索(统一设置为n+1个数字之后,搜索范围从1-n)<3>res保存最终结果,combination记录当前搜索过程,depth记录当前搜索树深度。<4>定义.原创 2021-11-03 21:00:45 · 351 阅读 · 0 评论 -
leetcode 40. 组合总和 II python
题目描述:题解一(超时):采用与39leetcode 39. 组合总和 python_ganggang的博客-CSDN博客类似的方法,但是由于不允许重复使用,增加一个记录数组中元素使用情况的数组used,初始为全0.class Solution(object): def combinationSum2(self, candidates, target): res = [] n = len(candidates) path = []原创 2021-10-15 20:34:44 · 156 阅读 · 0 评论 -
leetcode 39. 组合总和 python
题目描述:题解一:1.res保存最终解,path记录当前组合,sum记录当前path数字之和。2.在dfs函数中,如果当前sum与target相等,则说明找到一个结果,将path加入res(需要判断res中是否已经存在和path相同的组合)。如果当前sum小于target则从candidates中选择candidates[i]加入path,同时更新sum,然后再次调用dfs函数。class Solution(object): def combinationSum(se.原创 2021-10-15 17:31:08 · 348 阅读 · 0 评论 -
leetcode 47. 全排列 II python
题目描述:题解一:与46全排列相同,只是当depth=n,在path加入res之前进行一步判断,如果当前得到的path在res中不存在则添加。class Solution(object): def permuteUnique(self, nums): n = len(nums) used = [0 for i in range(n)] depth = 0 res = [] path = [] .原创 2021-10-14 21:06:19 · 112 阅读 · 0 评论 -
leetcode 46. 全排列 python
题目描述:题解:回溯参考:力扣1.res保存最终结果,path对应一个全排列,used记录nums中的数字是否已经被使用,初始化为全0.2.dfs函数中,依次对nums中的数进行判断,如果当前数字对应used为0,则加入path,然后在下一层调用dfs,然后依次回溯。如果当前depth等于nums的长度,则说明找到一种全排列,加入res,但要注意必须使用res.append(path[:])的方式,否则结果全空,因为最终回溯到根结点的path均为空。class Solut...原创 2021-10-13 11:34:13 · 366 阅读 · 0 评论