![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
DFS
leetcode DFS相关题目
Qin酱
这个人是个懒狗,什么都没有留下。
展开
-
DFS解题思路
1.理论知识:深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。2.条件在设计DFS函数的时候,首先写的语句就是弹出终止语句。之后才是递归的语句,否则会原创 2020-08-17 13:29:23 · 924 阅读 · 0 评论 -
leetcode 841. 钥匙和房间
841. 钥匙和房间有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间原创 2020-08-01 16:01:41 · 239 阅读 · 0 评论 -
leetcode 785. 判断二分图
785. 判断二分图给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。示例 1:输入: [[1,3], [0,2],原创 2020-07-16 11:26:54 · 144 阅读 · 0 评论 -
leetcode 559. N叉树的最大深度
559. N叉树的最大深度给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,给定一个 3叉树 :我们应返回其最大深度,3。说明:树的深度不会超过 1000。树的节点总不会超过 5000。"""# Definition for a Node.class Node: def __init__(self, val=None, children=None): self.val = val self.chi原创 2020-07-17 17:48:38 · 115 阅读 · 0 评论 -
leetcode 394. 字符串解码
394. 字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例原创 2020-07-31 18:24:40 · 164 阅读 · 0 评论 -
leetcode 337. 打家劫舍 III
337. 打家劫舍 III在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3/ \2 3\ \3 1输出原创 2020-07-10 09:47:07 · 86 阅读 · 0 评论 -
leetcode 329. 矩阵中的最长递增路径
329. 矩阵中的最长递增路径给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums =[[9,9,4],[6,6,8],[2,1,1]]输出: 4解释: 最长递增路径为 [1, 2, 6, 9]。示例 2:输入: nums =[[3,4,5],[3,2,6],[2,2,1]]输出: 4解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许原创 2020-07-26 10:48:49 · 120 阅读 · 0 评论 -
leetcode 257. 二叉树的所有路径
257. 二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3使用DFS,从根节点往下面回溯寻找每一条链路,并且将其加入字符串,到达叶子节点的时候,就加入到输出out。# Definition for a binary tr原创 2020-07-26 22:02:12 · 103 阅读 · 0 评论 -
leetcode 210. 课程表 II
210. 课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]]输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课原创 2020-07-26 20:55:12 · 151 阅读 · 0 评论 -
leetcode 207. 课程表
207. 课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出:原创 2020-07-26 19:33:02 · 138 阅读 · 1 评论 -
leetcode 200. 岛屿数量
200. 岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入: [ ['1','1','1','1','0'], ['1','1','0','1','0'], ['1','1','0','0','0'], ['0','0','0','0','0'] ]输出: 1示例 2:输入: [ ['1','1原创 2020-07-19 20:07:32 · 174 阅读 · 0 评论 -
leetcode 199. 二叉树的右视图
199. 二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <---这道题和之前的二叉树层次遍历是类似的,只不过,在这里我们只需要将每一层的最后一个数字加入到输出中,而不需要原创 2020-07-19 20:02:00 · 230 阅读 · 0 评论 -
leetcode 133. 克隆图
133. 克隆图给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node {public int val;public List neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。邻接列表 是用于表示有限图的无序列表的集合。原创 2020-07-30 13:02:56 · 128 阅读 · 0 评论 -
leetcode 130. 被围绕的区域
130. 被围绕的区域给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如原创 2020-07-19 19:56:30 · 133 阅读 · 0 评论 -
leetcode 129. 求根到叶子节点数字之和
129. 求根到叶子节点数字之和给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3]1/ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 =原创 2020-07-26 16:51:34 · 90 阅读 · 0 评论 -
leetdcode 124. 二叉树中的最大路径和
124. 二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7输出: 42这个题目知道是要用递归去做,一般二叉树都是递归。但是这道题有一个坑:我原创 2020-07-23 22:12:27 · 123 阅读 · 0 评论 -
leetcode 116. 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。这道题的连接思路为,每一行其实是有三个点, root.left,原创 2020-07-15 10:00:54 · 125 阅读 · 0 评论 -
leetcode 114. 二叉树展开为链表
114. 二叉树展开为链表给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6这道题开始也没想明白怎么弄,只知道可以前序遍历之后,再重新组合成一个右子树,同时左子树清零。但是还是有一些米奇妙妙屋的妙脆角方法:方案一1.将左子树插入到右原创 2020-07-23 09:32:30 · 103 阅读 · 0 评论 -
leetcode 113. 路径总和 II
113. 路径总和 II给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[[5,4,11,2],原创 2020-07-20 13:42:40 · 97 阅读 · 0 评论 -
leetcode 112. 路径总和
112. 路径总和给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5-&g原创 2020-07-07 12:07:53 · 82 阅读 · 0 评论 -
leetcode 111. 二叉树的最小深度
111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.这道题会有一种特殊情况就是单变二叉树,这样的话就不能简单的使用ans = min(solve(root.left), solve(root.right)) + 1,因为单原创 2020-07-17 19:28:11 · 108 阅读 · 0 评论 -
leetcode 110. 平衡二叉树
平衡二叉树树结构中的常见用语:节点的深度 - 从树的根节点到该节点的边数节点的高度 - 该节点和叶子之间最长路径上的边数树的高度 - 其根节点的高度一个高度平衡的二叉搜索树(平衡二叉搜索树)是在插入和删除任何节点之后,可以自动保持其高度最小。也就是说,有N个节点的平衡二叉搜索树,它的高度是logN。并且,每个节点的两个子树的高度不会相差超过1。正如我们之前提到的, 一个有N个节点的平衡二搜索叉树的高度总是logN。因此,我们可以计算节点总数和树的高度,以确定这个二叉搜索树是否为高度平衡.原创 2020-07-17 12:51:02 · 251 阅读 · 0 评论 -
leetcode 109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5链表中的中位数使用快慢指针进行查找。递归原创 2020-07-19 22:53:41 · 98 阅读 · 0 评论 -
leetcode 108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5这里才使用的是递归,由于需要构建二叉搜索树,根据其性质,我们每次首先应原创 2020-07-17 13:43:30 · 77 阅读 · 0 评论 -
leetcode 106. 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7前+后首先我们可以显然知道当前根节点为pre[pre_start],并且它在后序中的位置为post_end,因此这里我们需要找到能区分左右子树的节点。原创 2020-07-14 21:11:54 · 120 阅读 · 0 评论 -
leetcode 105. 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7首先要知道一个结论,前序/后序+中序序列可以唯一确定一棵二叉树,所以自然而然可以用来建树。看一下前序和中序有什么特点,前序1,2,4,7,3,5,6,8原创 2020-07-14 19:42:21 · 167 阅读 · 0 评论 -
leetcode 104. 二叉树的最大深度
104. 二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。这道题我们可以使用递归的方法求解,但是递归一般有两种方法:自顶向下的递归 和 自底向上的递归。首先是自顶向下的递归,第一步确定递归的返回条件:当本节点的子节点为空不存在的原创 2020-07-14 16:47:12 · 122 阅读 · 0 评论 -
leetcode 101. 对称二叉树
101. 对称二叉树给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3进阶:你可以运用递归和迭代两种方法解决这个问题吗?递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无原创 2020-07-14 17:58:09 · 123 阅读 · 0 评论 -
leetcode 100. 相同的树
100. 相同的树给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 1 / \ 2原创 2020-07-14 12:16:38 · 92 阅读 · 0 评论 -
leetcode 99. 恢复二叉搜索树
99. 恢复二叉搜索树二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例 1:输入: [1,3,null,null,2] 1 / 3 \ 2输出: [3,1,null,null,2] 3 / 1 \ 2示例 2:输入: [3,1,4,null,null,2] 3 / \1 4 / 2输出: [2,1,4,null,null,3] 2 / \1 4 / 3进阶:原创 2020-07-20 18:26:06 · 133 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树
98. 验证二叉搜索树定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为原创 2020-07-16 13:29:59 · 159 阅读 · 0 评论 -
leetcode 87. 扰乱字符串
87. 扰乱字符串给出两个长度相等的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。示例 1:输入: s1 = “great”, s2 = “rgeat”输出: true示例 2:输入: s1 = “abcde”, s2 = “caebd”输出: falsefrom typing import Listclass Solution: def isScramble(self, s1: str, s2: str) -> bool: if s1 ==原创 2020-07-08 20:21:46 · 231 阅读 · 1 评论 -
leetcode 44. 通配符匹配
44. 通配符匹配给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa原创 2020-07-07 10:18:43 · 215 阅读 · 0 评论 -
leetcode 10. 正则表达式匹配
10. 正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:原创 2020-07-06 23:01:43 · 152 阅读 · 0 评论