Skip to content

Commit 5325cb7

Browse files
committed
Update 0841. 钥匙和房间.md
1 parent fe352cf commit 5325cb7

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

Solutions/0841. 钥匙和房间.md

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,58 @@
55

66
## 题目大意
77

8-
`n` 个房间,编号为 `0` ~ `n - 1`,每个房间都有若干把钥匙,每把钥匙上都有一个编号,可以开启对应房间号的门。最初,除了 `0` 号房间外其他房间的门都是锁着的。
8+
**描述**`n` 个房间,编号为 `0` ~ `n - 1`,每个房间都有若干把钥匙,每把钥匙上都有一个编号,可以开启对应房间号的门。最初,除了 `0` 号房间外其他房间的门都是锁着的。
99

10-
现在给定一个二维数组 `rooms``rooms[i][j]` 表示第 i 个房间的第 j 把钥匙所能开启的房间号。
10+
现在给定一个二维数组 `rooms``rooms[i][j]` 表示第 `i` 个房间的第 `j` 把钥匙所能开启的房间号。
1111

12-
要求:判断是否能开启所有房间的门。如果能开启,则返回 `True`。否则返回 `False`
12+
**要求**:判断是否能开启所有房间的门。如果能开启,则返回 `True`。否则返回 `False`
13+
14+
**说明**
15+
16+
- $n == rooms.length$。
17+
- $2 \le n \le 1000$。
18+
- $0 \le rooms[i].length \le 1000$。
19+
- $1 \le sum(rooms[i].length) \le 3000$。
20+
- $0 \le rooms[i][j] < n$。
21+
- 所有 $rooms[i]$ 的值互不相同。
22+
23+
**示例**
24+
25+
```Python
26+
输入:rooms = [[1],[2],[3],[]]
27+
输出:True
28+
解释:
29+
我们从 0 号房间开始,拿到钥匙 1
30+
之后我们去 1 号房间,拿到钥匙 2
31+
然后我们去 2 号房间,拿到钥匙 3
32+
最后我们去了 3 号房间。
33+
由于我们能够进入每个房间,我们返回 true。
34+
35+
36+
输入:rooms = [[1,3],[3,0,1],[2],[0]]
37+
输出:False
38+
解释:我们不能进入 2 号房间。
39+
```
1340

1441
## 解题思路
1542

43+
### 思路 1:深度优先搜索
44+
1645
`x` 号房间有 `y` 号房间的钥匙时,就可以认为我们可以通过 `x` 号房间去往 `y` 号房间。现在把 `n` 个房间看做是拥有 `n` 个节点的图,则上述关系可以看做是 `x``y` 点之间有一条有向边。
1746

1847
那么问题就变为了给定一张有向图,从 `0` 节点开始出发,问是否能到达所有的节点。
1948

20-
我们可以先建图,然后可以从 `0` 节点开始,使用深度优先搜索的方式遍历整个图,并使用 `set` 集合来统计遍历到的节点个数。
49+
我们可以使用深度优先搜索的方式来解决这道题,具体做法如下:
2150

22-
最终判断一下遍历到的节点个数是否等于图的节点个数。如果等于,则返回 `True`,否则返回 `False`
51+
1. 使用 set 集合变量 `visited` 来统计遍历到的节点个数。
52+
2.`0` 节点开始,使用深度优先搜索的方式遍历整个图。
53+
3. 将当前节点 `x` 加入到集合 `visited` 中,遍历当前节点的邻接点。
54+
1. 如果邻接点不再集合 `visited` 中,则继续递归遍历。
55+
4. 最后深度优先搜索完毕,判断一下遍历到的节点个数是否等于图的节点个数(即集合 `visited` 中的元素个数是否等于节点个数)。
56+
1. 如果等于,则返回 `True`
57+
2. 如果不等于,则返回 `False`
2358

24-
## 代码
59+
### 思路 1:代码
2560

2661
```Python
2762
class Solution:
@@ -36,3 +71,7 @@ class Solution:
3671
return len(visited) == len(rooms)
3772
```
3873

74+
### 思路 1:复杂度分析
75+
76+
- **时间复杂度**:$O(n + m)$,其中 $n$ 是房间的数量,$m$ 是所有房间中的钥匙数量的总数。
77+
- **空间复杂度**:$O(n)$,递归调用的栈空间深度不超过 $n$。

0 commit comments

Comments
 (0)