LeetCode75学习计划-图的DFS/BFS
算法解题思路很多会借鉴于题解区,如果侵权请联系删除。
本章节知识点为图的DFS/BFS。
钥匙和房间
题目标签:
- 图
- 深度优先搜索
- 广度优先搜索
题目难度: Medium
题目描述:
有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。
给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。
解题思路:
- 深度优先访问房间,对访问过的房间进行标记,最后判断是否能访问所有房间
代码实现:
1 | func canVisitAllRooms(rooms [][]int) bool { |
省份数量
题目标签:
- 图
- 深度优先搜索
- 广度优先搜索
题目难度: Medium
题目描述:
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
解题思路:
- 与上题类似,dfs加标记节点
代码实现:
1 | func findCircleNum(isConnected [][]int) int { |
迷宫中离入口最近的出口
题目标签:
- 数组
- 矩阵
- 广度优先搜索
题目难度: Medium
题目描述:
给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。
每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近 的出口。出口 的含义是 maze 边界 上的 空格子。entrance 格子 不算 出口。
请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。
解题思路:
- 从起点开始,广度遍历找出口,最近的一个出口返回
代码实现:
1 | func nearestExit(maze [][]byte, entrance []int) int { |
腐烂的橘子
题目标签:
- 数组
- 矩阵
- 广度优先搜索
题目难度: Medium
题目描述:
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值
0代表空单元格; - 值
1代表新鲜橘子; - 值
2代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
解题思路:
- 与上题类似,还是一层层遍历即可
代码实现:
1 | func orangesRotting(grid [][]int) int { |
LeetCode75学习计划-图的DFS/BFS
https://zhaolei-hu.github.io/2023/10/14/LeetCode75学习计划-图的DFS-BFS/