dfs
文章平均质量分 64
有关深度优先遍历的使用和方法总结。
重剑DS
学的越多,越觉无知
展开
-
浙江农林大学第十九届程序设计竞赛暨天梯赛选拔赛(同步赛)——灾难预警(二分 + dfs解题)
链接:https://ac.nowcoder.com/acm/contest/7872/M来源:牛客网题目描述众所周知,浙农林是一条河。由于浙江农林大学的特殊地形,当你在下雨后漫步在农林大路上的时候难免会出现一脚踩进一个水坑的情况的情况。而农农非常不喜欢踩到水坑的感觉,请你帮忙设计一个程序来帮助农农判断他能否在不踩入水坑的情况下回到寝室。已知,浙江农林大学可以表示为一个 N * N 的矩阵。对于每个位置有一个海拔数...原创 2020-11-16 13:53:22 · 300 阅读 · 0 评论 -
N皇后解题模板---回溯算法解题
题目详情n皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回 n 皇后不同的解决方案的数量。示例:输入: 4输出: 2解释: 4 皇后问题存在如下两个不同的解法。[[".Q..", // 解法 1"...Q","Q...","..Q."],["..Q.", // 解法 2"Q...","...Q",".Q.."]]提示:皇后,...原创 2020-10-17 11:07:36 · 241 阅读 · 0 评论 -
494. 目标和(C++)---深度优先搜索 和 01背包动态规划 解题
给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3一共有5种方法让最...原创 2020-10-11 20:05:22 · 181 阅读 · 0 评论 -
47. 全排列 II(C++)--- 回溯法解题
题目详情给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations-ii——题目难度:中等解题代码class Solution {private: map<int, int> mp; vector<vec...原创 2020-10-10 21:43:33 · 170 阅读 · 0 评论 -
690. 员工的重要性(C++)---哈希表 + dfs 解题
题目详情给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度和 直系下属的id。比如,员工1是员工2的领导,员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和。示.原创 2020-10-03 22:10:29 · 144 阅读 · 0 评论 -
113. 路径总和 II(C++)---DFS解题
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2], ...原创 2020-09-26 10:14:43 · 103 阅读 · 0 评论 -
501. 二叉搜索树中的众数(C++)
题目详情给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值 左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2], 1 \ 2 / 2返回[2].提示:如果众数超过1个,不需考虑输出顺序进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)...原创 2020-09-24 12:39:36 · 216 阅读 · 0 评论 -
841. 钥匙和房间(C++)---深度优先搜索解题
有 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-31 19:30:14 · 281 阅读 · 0 评论 -
332. 重新安排行程(C++)---找欧拉通路 / 深度优先搜索解题
题目详情给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。说明:如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前 所有的机场都用三个大写字母表示(机场代码)。 假定所有机票至少存在一种合理的行程。示例 1:原创 2020-08-27 11:17:57 · 329 阅读 · 0 评论 -
17. 电话号码的字母组合
题目详情给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。——题目难度:中等-直接上代码class Solution {private: unordered_map<..原创 2020-08-26 08:59:59 · 116 阅读 · 0 评论 -
491. 递增子序列(C++)---dfs + 去重
题目详情给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明:给定数组的长度不会超过15。 数组中的整数范围是 [-100,100]。 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。——题目难度:中等-解题代码c...原创 2020-08-25 15:11:08 · 191 阅读 · 0 评论 -
529. 扫雷游戏(C++)---DFS解题
题目详情让我们一起来玩扫雷游戏!给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。原创 2020-08-20 09:24:32 · 309 阅读 · 0 评论 -
733. 图像渲染(C++)---DFS解题
题目详情有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。最后返回原创 2020-08-16 09:00:47 · 267 阅读 · 0 评论 -
130. 被围绕的区域(C++)---DFS解题
题目详情给定一个二维的矩阵,包含 '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-08-11 12:13:37 · 867 阅读 · 0 评论 -
99. 恢复二叉搜索树(C++)---中序遍历解法
题目详情二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例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-08-08 09:38:33 · 225 阅读 · 0 评论 -
337. 打家劫舍 III (C++)---DFS / 动态规划解题
题目详情在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 ...原创 2020-08-05 09:19:35 · 262 阅读 · 0 评论 -
114. 二叉树展开为链表(C++)
题目详情给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5/ \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6——题目难度:中等-前序遍历解法 - 递归实现class Solution {public: void pr...原创 2020-08-02 10:26:39 · 183 阅读 · 0 评论 -
牛牛打怪兽(C++)---DFS解题
题目描述题意身为屯里第一剑士的牛牛来到训练场里闯关,由于过于勤奋,牛牛的宝剑的耐久度降到了 222 ,这意味着牛牛最多只能打倒两只怪兽,否则将会被淘汰。训练场的地图可以看作一棵以 111 为根节点的树,训练场的终点为这棵树的叶子结点,树上的每个结点最多有一只怪兽,结点与结点间的边上没有怪兽。每一个有怪兽的结点上牛牛都需要打倒怪兽才算安全,并且牛牛一旦选定好打怪路线之后便不能走回头路。请问牛牛有多少种到达终点且不被淘汰的路径。输入第一个参数为 nnn ,(1≤n≤100,00...原创 2020-07-31 09:20:20 · 643 阅读 · 0 评论 -
104. 二叉树的最大深度(C++)---深度优先搜索(递归版) / 深度优先搜索(栈循环) / 宽度优先搜索(队列循环) 解题
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。——题目难度:简单DFS递归版 解题-dfs递归版 代码/** * Definition for a binary tree node. * struct Tree...原创 2020-07-28 09:40:15 · 151 阅读 · 0 评论 -
329. 矩阵中的最长递增路径(C++)---记忆化深度优先搜索 解题
题目详情给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 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 09:17:13 · 521 阅读 · 0 评论 -
785. 判断二分图(C++)---DFS/ BFS 解题(包含介绍 自环边 和 平行边)
题目详情给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。示例 1:输入: [[1,3], [0,2], [1,原创 2020-07-16 11:12:24 · 1274 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树(C++)---深度优先搜索解题
题目详情将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5——题目难度:简单-解题代码class Solution {...原创 2020-07-03 11:01:36 · 183 阅读 · 0 评论 -
124. 二叉树中的最大路径和(C++)---递归解题
题目详情给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \9 20 / \15 7输出: 42——题目难度:困难感觉发现了 力扣每日一题 一到周末 官方就会...原创 2020-06-21 12:14:25 · 1403 阅读 · 2 评论 -
100. 相同的树(C++) 8行代码解题
题目详情给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 1 / \ 2 2 ...原创 2020-06-15 11:22:01 · 179 阅读 · 0 评论 -
用DFS求连通块 (种子填充(floodfill))
前言 图(Graph)描述的是一些个体之间的关系。与线性表和二叉树不同的是:这些个体之间既不是前驱后继的顺序关系,也不是祖先后代的层次关系,而是错综复杂的网状关系。例题6-12 油田(Oil Deposits,UVa 572)题意:输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。Sample Input1 1*3 5*@*@***@***@*@*1 8@...原创 2020-06-14 16:06:08 · 282 阅读 · 0 评论 -
两种常见的全排列形式(C++)---含DFS全排列 和 使用库函数排列
目录1.一般的全排列方式2.DFS(Depth-First-Search)---深度优先搜索 全排列方式·BFS(Breadth First Search)---宽度优先搜索以**例题**的形式来说明下两种常见的全排列方式(均使用递归版)1.一般的全排列方式题目详情编写递归函数,显示n个数字的全排列。编写主函数,输入非负整数n,调用函数显示全排列。输入格...原创 2020-04-22 20:27:15 · 1098 阅读 · 0 评论 -
126. 单词接龙 II(C++)---BFS、DFS解题
题目详情给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWor原创 2020-06-07 11:21:14 · 356 阅读 · 0 评论 -
101. 对称二叉树(C++)---DFS递归解题 / 队列迭代解题(包含 队列 的介绍及使用)
题目详情给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[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进阶:你可以运用递归和迭代两种方法解决这个问题吗?——题目难度:简单-DFS递归版代码class Solutio...原创 2020-05-31 10:05:07 · 308 阅读 · 0 评论 -
DFS(Depth-First-Search)---深度优先搜索
对于二叉树T,可以递归定义它的先序遍历、中序遍历和后序遍历。先序遍历:PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树)中序遍历:InOrder(T)=InOrder(T的左子树)+T的根节点+InOrder(T的右子树)后序遍历:PostOrder(T)=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点可以看看这位大佬写的(很详细)→关于二叉树的前序、中序、后序三种遍历这三种遍历都属于递归遍历,或者说深度优先遍历(...原创 2020-06-14 15:38:05 · 383 阅读 · 0 评论