题目描述
思路解析动画文字版
记住「先查 visited、没去过才进」这一招,下面每一步都在用它。
8 个房间在这里:箭头表示「这个房间里的钥匙能开哪间」。房间 0 已解锁(橙色起点),其余都锁着。
进入房间 0:先记进 visited,再把里面的钥匙拿上——这间有 钥匙 1、2。
房间 0 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 0 的钥匙 1:房间 1 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 1:先记进 visited,再把里面的钥匙拿上——这间有 钥匙 3。
房间 1 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 1 的钥匙 3:房间 3 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 3:先记进 visited,再把里面的钥匙拿上——这间有 没有钥匙。
房间 3 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 0 的钥匙 2:房间 2 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 2:先记进 visited,再把里面的钥匙拿上——这间有 钥匙 4、5。
房间 2 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 2 的钥匙 4:房间 4 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 4:先记进 visited,再把里面的钥匙拿上——这间有 钥匙 6。
房间 4 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 4 的钥匙 6:房间 6 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 6:先记进 visited,再把里面的钥匙拿上——这间有 钥匙 7。
房间 6 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 6 的钥匙 7:房间 7 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 7:先记进 visited,再把里面的钥匙拿上——这间有 没有钥匙。
房间 7 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
用房间 2 的钥匙 5:房间 5 还没进过 → 沿这条边走过去,深入它继续找钥匙。
进入房间 5:先记进 visited,再把里面的钥匙拿上——这间有 没有钥匙。
房间 5 标记为已访问,加入「已进入」面板。接着逐把钥匙去开它能开的房间。
DFS 走完:8 个房间全部进过(visited 大小 = 房间数)→ 返回 true。从 0 出发,钥匙链能把每间都串起来。
边界先想清:钥匙开不到的房间就永远进不去。
两个高频追问。
参考代码
def canVisitAllRooms(rooms): visited = set() def dfs(r): visited.add(r) # 进房间先记下 for key in rooms[r]: # 拿到的每把钥匙 if key not in visited: # 那间还没去过 dfs(key) # 走过去继续 dfs(0) # 从房间 0 出发 return len(visited) == len(rooms)复杂度
- 时间:O(n+e),每个房间进一次、每把钥匙看一次(n 房间、e 钥匙总数)
- 空间:O(n),visited 集合 + 递归栈最深 n 层
易错点
面试追问把动画讲成自己的话
追问DFS 还是 BFS 都能做吗?
追问怎么判断答案是 false?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
喧闹和富有
LeetCode 851 · 中等 · 沿着 图论套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题