0841. 钥匙和房间【中等】
1. 📝 题目描述
有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
当你进入一个房间,你可能会在里面找到一套 不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。
给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。
示例 1:
txt
输入:rooms = [[1],[2],[3],[]]
输出:true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
示例 2:
txt
输入:rooms = [[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。1
2
3
2
3
提示:
n == rooms.length2 <= n <= 10000 <= rooms[i].length <= 10001 <= sum(rooms[i].length) <= 30000 <= rooms[i][j] < n- 所有
rooms[i]的值 互不相同
2. 🎯 s.1 - DFS
c
bool canVisitAllRooms(int** rooms, int roomsSize, int* roomsColSize) {
bool* visited = (bool*)calloc(roomsSize, sizeof(bool));
int* stack = (int*)malloc(sizeof(int) * roomsSize);
int top = 0;
stack[top++] = 0;
visited[0] = true;
while (top > 0) {
int room = stack[--top];
for (int i = 0; i < roomsColSize[room]; i++) {
int key = rooms[room][i];
if (!visited[key]) { visited[key] = true; stack[top++] = key; }
}
}
bool res = true;
for (int i = 0; i < roomsSize; i++) if (!visited[i]) { res = false; break; }
free(visited); free(stack);
return res;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
js
/**
* @param {number[][]} rooms
* @return {boolean}
*/
var canVisitAllRooms = function (rooms) {
const n = rooms.length
const visited = new Array(n).fill(false)
const stack = [0]
visited[0] = true
while (stack.length) {
const room = stack.pop()
for (const key of rooms[room]) {
if (!visited[key]) {
visited[key] = true
stack.push(key)
}
}
}
return visited.every((v) => v)
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
py
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
visited = set()
stack = [0]
visited.add(0)
while stack:
room = stack.pop()
for key in rooms[room]:
if key not in visited:
visited.add(key)
stack.append(key)
return len(visited) == len(rooms)1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 时间复杂度:
,其中 V 是房间数,E 是钥匙总数 - 空间复杂度:
算法思路:
- 从房间 0 开始 DFS/BFS,用钥匙打开新房间
- 检查是否所有房间都被访问过