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
}

posted on   进击的davis  阅读(109)  评论(0编辑  收藏  举报

编辑推荐:
· 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)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示