0841-钥匙与房间
有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙取解锁其他房间。
给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。
示例 1:
输入:rooms = [[1],[2],[3],[]]
输出:true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。
示例 2:
输入:rooms = [[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。
提示:
n == rooms.length
2 <= n <= 1000
0 <= rooms[i].length <= 1000
1 <= sum(rooms[i].length) <= 3000
0 <= rooms[i][j] < n
所有 rooms[i] 的值 互不相同
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/keys-and-rooms
参考:
python
# 0841.钥匙和房间 class Solution: def canVisitAllRooms(self, rooms: [[int]]) -> bool: """ 有向图,广度优先-BFS :param rooms: :return: """ def bfs(rooms): visited = [0 for _ in range(len(rooms))] # 标记房间是否访问过 visited[0] = 1 # 0号房间 queue = [] queue.append(0) # 0号房间开始 # BFS while queue: key = queue.pop() # 下标 keys = rooms[key] # 获取对应下标的钥匙 for key_ in keys: # 遍历钥匙 if not visited[key_]: # 钥匙没有遇到过的 queue.append(key_) # 加入队列 visited[key_] = 1 # 标记已经访问过 # 检查房间是不是都遍历了 for val in visited: if val == 0: # 房间没有遍历过 return False return True return bfs(rooms) def canVisitAllRooms_(self, rooms: [[int]]) -> bool: """ 有向图,深度优先-DFS :param rooms: :return: """ def dfs(key, rooms, visited): if visited[key]: return visited[key] = 1 keys = rooms[key] for key_ in keys: dfs(key_, rooms, visited) visited = [0 for _ in range(len(rooms))] dfs(0, rooms, visited) # 检查是否都遍历了 for val in visited: if val == 0: return False return True
golang
package MAP // 有向图-BFS, LC未过! func canVistiedAllROoms(rooms [][]int) bool { var bfs func(rooms [][]int) bool bfs = func(rooms [][]int) bool { visited := make([]int, len(rooms)) for i := range visited { visited[i] = 0 } visited[0] = 1 queue := make([]int, 1) queue[0] = 0 // bfs for len(queue) > 0 { key := queue[len(queue)-1] queue = queue[:len(queue)-1] keys := rooms[key] for i:=0;i<len(keys);i++ { if visited[keys[i]] != 0 { queue = append(queue, keys[i]) visited[keys[i]] = 1 } } } // 检查是否都访问过 for _, val := range visited { if val == 0 { return false } } return true } return bfs(rooms) } // 有向图-dfs func canVisitedAllRooms_(rooms [][]int) bool { var dfs func(key int, rooms [][]int, visited []int) dfs = func(key int, rooms [][]int, visited []int) { if visited[key] == 1 { return } visited[key] = 1 keys := rooms[key] for _, key_ := range keys { dfs(key_, rooms, visited) } } visited := make([]int, len(rooms)) for i := range visited { visited[i] = 0 } dfs(0, rooms, visited) for _, val := range visited { if val == 0 { return false } } return true }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)