5
5
6
6
## 题目大意
7
7
8
- 有 ` n ` 个房间,编号为 ` 0 ` ~ ` n - 1 ` ,每个房间都有若干把钥匙,每把钥匙上都有一个编号,可以开启对应房间号的门。最初,除了 ` 0 ` 号房间外其他房间的门都是锁着的。
8
+ ** 描述 ** : 有 ` n ` 个房间,编号为 ` 0 ` ~ ` n - 1 ` ,每个房间都有若干把钥匙,每把钥匙上都有一个编号,可以开启对应房间号的门。最初,除了 ` 0 ` 号房间外其他房间的门都是锁着的。
9
9
10
- 现在给定一个二维数组 ` rooms ` ,` rooms[i][j] ` 表示第 i 个房间的第 j 把钥匙所能开启的房间号。
10
+ 现在给定一个二维数组 ` rooms ` ,` rooms[i][j] ` 表示第 ` i ` 个房间的第 ` j ` 把钥匙所能开启的房间号。
11
11
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
+ ```
13
40
14
41
## 解题思路
15
42
43
+ ### 思路 1:深度优先搜索
44
+
16
45
当 ` x ` 号房间有 ` y ` 号房间的钥匙时,就可以认为我们可以通过 ` x ` 号房间去往 ` y ` 号房间。现在把 ` n ` 个房间看做是拥有 ` n ` 个节点的图,则上述关系可以看做是 ` x ` 与 ` y ` 点之间有一条有向边。
17
46
18
47
那么问题就变为了给定一张有向图,从 ` 0 ` 节点开始出发,问是否能到达所有的节点。
19
48
20
- 我们可以先建图,然后可以从 ` 0 ` 节点开始,使用深度优先搜索的方式遍历整个图,并使用 ` set ` 集合来统计遍历到的节点个数。
49
+ 我们可以使用深度优先搜索的方式来解决这道题,具体做法如下:
21
50
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 ` 。
23
58
24
- ## 代码
59
+ ### 思路 1: 代码
25
60
26
61
``` Python
27
62
class Solution :
@@ -36,3 +71,7 @@ class Solution:
36
71
return len (visited) == len (rooms)
37
72
```
38
73
74
+ ### 思路 1:复杂度分析
75
+
76
+ - ** 时间复杂度** :$O(n + m)$,其中 $n$ 是房间的数量,$m$ 是所有房间中的钥匙数量的总数。
77
+ - ** 空间复杂度** :$O(n)$,递归调用的栈空间深度不超过 $n$。
0 commit comments