![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DFS
DFS
algsup
这个作者很懒,什么都没留下…
展开
-
[dfs求连通块大小]leetcode690:员工的重要性(medium)
思路:本质上就是有向无环图求连通块大小的问题,直接使用dfs统计即可。原创 2023-01-16 12:38:10 · 259 阅读 · 0 评论 -
[dfs判断连通性]leetcode1391:检查网格中是否存在有效路径(medium)
思路:建图+dfs判断连通性。原创 2023-01-15 21:28:46 · 252 阅读 · 0 评论 -
[递归][dfs]leetcode222:完全二叉树的节点个数(medium)
【代码】[递归][dfs]leetcode222:完全二叉树的节点个数(medium)原创 2023-01-15 15:46:55 · 263 阅读 · 0 评论 -
[双dfs]leetcode2458:移除子树后的二叉树高度(hard)
【代码】[双dfs]leetcode2458:移除子树后的二叉树高度(hard)原创 2022-11-07 20:51:24 · 435 阅读 · 0 评论 -
[bfs][dfs]leetcode6182:反转二叉树的奇数层(medium)
思路1:比较直观的方式是使用 bfs 来翻转奇数层的所有节点值,这里需要使用双端队列 deque 来实现,不然使用单向队列 queue 实现容易陷入思想误区。这样来交换奇数层的节点值,同时奇数层的节点值交换是顺着祖先自上而下的,也就是最左边的节点值和最右边的节点值交换,依次向中间靠拢交叉交换的。设计 dfs 需要同时考虑。原创 2022-09-19 09:37:10 · 382 阅读 · 0 评论 -
[dfs + 枚举]leetcode827:最大人工岛(hard)
思路:dfs + 枚举。原创 2022-09-18 13:57:14 · 314 阅读 · 0 评论 -
[dfs][bfs][图论]leetcode6154:感染二叉树需要的总时间(medium)
思路:dfs建图 + dfs 或 bfs 寻找节点 u 出发的最大深度。原创 2022-08-21 20:47:27 · 151 阅读 · 0 评论 -
[图][DFS]leetcode6139:受限条件下可到达节点的数目(medium)
思路:建图 + DFS 遍历。原创 2022-08-08 10:04:54 · 175 阅读 · 0 评论 -
[二叉树][dfs][bfs]leetcode297:二叉树的序列化与反序列化(hard)
题目:题解:原创 2019-08-21 19:36:19 · 320 阅读 · 0 评论 -
[dfs]l[多源bfs]eetcode130:被围绕的区域(medium)
题目:题解:思路:从边界上的’O’出发,把所有和边界’O’相连的’O’全部染为’A’,这样内陆的’O’最后未被染色,然后再一次遍历网格,遍历到的元素为’A’时还原为’O’,遍历到的元素为’O’时染为’X’,由于每个位置直访问一次,所以不会重现’A’改为’'O再改为’X’的情况。从边界上的’O‘出发既可以使用 dfs,也可以使用多源 bfs。代码如下:int dx[]={1,-1,0,0},dy[]={0,0,1,-1};class Solution {public: //原创 2022-02-13 09:46:51 · 174 阅读 · 0 评论 -
[bfs][dfs]leetcode1020:飞地的数量(medium)
题目:题解:思路:经典的二维矩阵搜索题,写bfs或者dfs都行,写带返回值类型的dfs可能会麻烦点,看代码细节即可。代码如下:int dx[]={1,-1,0,0},dy[]={0,0,1,-1};class Solution {public: int m,n; int numEnclaves(vector<vector<int>>& g) { m=g.size(),n=g[0].size(); int原创 2022-02-12 11:22:14 · 236 阅读 · 0 评论 -
[bfs][dfs]leetcode547:省份数量(medium)
题目:题解:思路:本题为图的邻接表存储图,采用 bfs 或者 dfs 来遍历连通分量,统计图中连通分量的个数。代码如下:class Solution{public: // 题目给的是邻接矩阵,然后判断邻接矩阵中的连通块的个数 bool visited[210]; int n,cnt; int findCircleNum(vector<vector<int>>& g) { memset(visited,0,s原创 2022-01-29 22:40:04 · 347 阅读 · 0 评论 -
[bfs][dfs]695:岛屿的最大面积(medium)
题目:题解:使用染色法进行dfs即可,采用带返回值的dfs和不带返回值的dfs两种方法都行。代码如下:int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};class Solution {public: int m,n; int maxAreaOfIsland(vector<vector<int>>& grid) { m=grid.size(),n=grid[0].size();原创 2022-01-12 16:58:56 · 177 阅读 · 0 评论 -
[bfs][dfs]leetcode733:图像渲染(easy)
题目:思路:bfs+dfs模板题代码如下:int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};using PII = pair<int,int>;class Solution {public: // 思路1:bfs vector<vector<int>> floodFill_1(vector<vector<int>>& image, int sr, int sc,原创 2022-01-12 16:27:35 · 180 阅读 · 0 评论 -
[离散化][dfs][bfs]leetcode1036:逃离大迷宫(hard)
题目:题解:思路1:离散化+dfs将每个坐标点 (x,y) 的 x 坐标和 y 坐标分别离散化,然后排序去重映射到0~k-1之间的整数中(因为去重后只有k个不同的整数)。因为因为在映射过程中,不同的 x、y 的相对大小不变,所以这样映射各个点的相对方位不变。由于路障点最多有200个,再加上起点和终点,这样最多有202个坐标点。对于 x 坐标或 y 坐标在映射过程中,需要前后留空,避免原本不相邻的点,离散后边得相邻了。因此在离散化 x 的时候,给每个 x 前后留空,这样 x 坐标最多有 20原创 2022-01-11 19:32:27 · 363 阅读 · 0 评论 -
[dfs]leetcode1706:球会落何处(medium)
题目:题解:本题意图很明显 dfs 即可,但是我们需要把几种递归边界思考清楚就好了,分别是:找到可行解、卡在边界、卡在中间 三种情况,剩下的看代码即可。代码如下:class Solution {public: int n,m; vector<int> findBall(vector<vector<int>>& grid) { n=grid.size(),m=grid[0].size(); vect原创 2021-02-21 10:09:51 · 147 阅读 · 0 评论 -
[双向dfs]leetcode1755:最接近目标值的子序列和(hard)
题目:题解:由于 2^40 ≈ 10^12,这样直接dfs枚举每个数组值的话肯定会超时的,所以我们将数组一分为二,分别搜索两部分来降低时间复杂度。算法步骤:1)第一次搜索:我们枚举前半段数组的所有元素选或不选得到所有状态的子序列和 sum,然后将每个 sum 存入数组 q,并对数组 q 进行排序。2)第二次搜索:尝试从后半段数组中选一些元素,找到后半段一个可行解 sum 后,然后我们二分查找数组 q,即从前半段中选一个子序列的和,然后二分找到小于等于 goal 的最大位置(sum+q[mi原创 2021-02-08 20:48:57 · 285 阅读 · 0 评论 -
[bfs][dfs]剑指 Offer 13. 机器人的运动范围(medium)
题目:题解:bfs dfs 纯模板题。代码如下:// 四个方向数组int dx[]={-1,0,1,0},dy[]={0,1,0,-1};// 标记数组,防止点重复访问bool visited[110][110];using PII = pair<int,int>;class Solution {public: // 题解1:dfs int movingCount_1(int m, int n, int k) { memset(v原创 2021-02-03 17:10:04 · 151 阅读 · 0 评论 -
[bfs][dfs]leetcode547:省份数量(medium)
题目:题解:本题给的是一个无向图的邻接矩阵,而题目要我们求的是该无向图的联通分量数。思路1:dfs用visited数组来标记顶点是否访问访问过,然后我们枚举每个顶点,将枚举到的顶点的邻接点全部加入标记,表示为同一个联通量,直到枚举到的顶点没有邻节点,我们在枚举下一个没有被访问过的顶点。每次访问完一个联通量,将res+1。思路2:bfs与dfs思路是一样的,不过使用队列在存储并访问邻接点,直到队列为空,表示我们找到一个联通量了,将res+1。代码如下:// 用来记录顶点i原创 2021-02-02 00:01:14 · 239 阅读 · 0 评论 -
[bfs][dfs]面试题 16.19. 水域大小(medium)
题目:题解:bfs dfs 纯模板题,思路看代码即可。代码如下:// 方向数组,由于对角线也算水域范围,所以为8个方向int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};// 用来标记水域是否被统计过bool flag[1010][1010];class Solution {public: void dfs(vector<vector<int>>& land,int i,int原创 2021-02-01 17:55:29 · 231 阅读 · 0 评论 -
[拓扑排序][dfs]leetcode5665:从相邻元素对还原数组(medium)
题目:题解:本题最难的是将这个实际问题转换为图论问题来做,我比赛就没想到,然后等比赛结束了,看到别人的思路才知道这题原来这么简单。思路1:拓扑排序构建无向图,然后记录顶点的度(注意是总度数=入度+出度),由于起点和终点只出现了一次,所以度为1,而其他点出现的两次(度为2),而此时按题目的意思,我们每次都要选度为1的点作为起点就进行遍历,这样就转换为topsort问题了。思路二:DFS遍历无向树,这棵树是比较特别是一棵单边的无向树,所以直接dfs遍历即可,主要防止无向树向根节点回搜原创 2021-01-31 21:42:26 · 188 阅读 · 0 评论 -
[dfs]leetcode695:岛屿的最大面积(medium)
题目:题解:dfs把200. 岛屿数量、1254. 统计封闭岛屿的数目这两个题目好好做做,你就会发现同样的套路了。代码如下:class Solution {public: int maxAreaOfIsland(vector<vector<int>>& grid) { int res=0; int m=g...原创 2020-02-17 14:16:58 · 434 阅读 · 0 评论 -
[二叉树][dfs]leetcode872:叶子相似的树(easy)
题目:题解:使用dfs,分别两棵树的所有叶子节点存放在两个vector中,最后判断两个vector是否相等就好了。代码如下:class Solution {public: bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector<int> nums1,nums2; ...原创 2020-01-09 23:34:23 · 248 阅读 · 0 评论 -
[二叉树][dfs]leetcode572:另一个树的子树(easy)
题目:572. 另一个树的子树题解:两层递归,第一层递归,来确定t与s相等,还是t是s的左子树或s的右子树。第二层递归,判断这两棵树是否相等。一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵树的左子树;要么这棵树是另一颗树的右子树。代码如下:class Solution {public: //一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵...原创 2020-01-09 22:18:11 · 194 阅读 · 0 评论 -
[dfs]leetcode404:左叶子之和(easy)
题目:题解:简单的dfs代码如下:class Solution {public: int sumOfLeftLeaves(TreeNode* root) { if(!root)return 0; int sum=0; dfs(root,sum); return sum; } void df...原创 2020-01-04 23:56:17 · 177 阅读 · 0 评论 -
[dfs]leetcode257:二叉树的所有路径(easy)
题目:题解:经典的dfs框架,大家直接看代码即可。代码如下:class Solution {public: vector<string> binaryTreePaths(TreeNode* root) { if(!root)return {}; vector<string> res; helper(...原创 2019-12-27 23:55:05 · 195 阅读 · 0 评论 -
[记忆化dfs]leetcode329:矩阵中的最长递增路径(hard)
题目:题解:标准带记忆化的dfs,每个点可以向四个方向递归,递归到边界,该边界的点作为路径上的最后一个点,然后路径长度+1,等到最小子问题解决了,总问题就解决了。代码如下:class Solution {private: vector<vector<int>> demo; int dire[4][2]={{0,-1},{-1,0},{0,...原创 2019-12-20 14:43:01 · 228 阅读 · 0 评论 -
[01背包][dfs]leetcode494:目标和(medium)
题目:解题思路:1)利用动态规划解题:1.每个元素可看作一个物品,+1表示将此物品取出,-1表示将此物品放回2.sum表示将所有物品全部取出,sum+S表示有些物品取出两次,有些物品取出后又放回,这样就是表示+1的有两次,除以2就是+1的取出一次。3.本题本质和01背包一样的,利用动态规划解题2)使用DFS穷举所有可能的情况,暴搜+剪枝代码如下:class Solution ...原创 2019-08-10 09:29:38 · 315 阅读 · 0 评论 -
[DFS]leetcode5297:跳跃游戏 III (medium)
题目:题解:典型的dfs题,需要理解一下注意点,具体实现直接看代码即可。注意点:1)每个点只需要访问一次,因为如果该点不能跳到0,那么通过其他跳法跳到该点也不能跳到0,所以每访问一个点我们就需要记录一次。2)若跳到0,我们就不必继续dfs了,直接返回true即可。代码如下:class Solution {public: bool canReach(vector...原创 2019-12-29 23:11:26 · 168 阅读 · 0 评论