钥匙和房间

841. 钥匙和房间 - 力扣(LeetCode)

n 个房间,房间按从 0n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。

当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。

给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false

示例 1:

1
2
3
4
5
6
7
8
输入:rooms = [[1],[2],[3],[]]
输出:true
解释:
我们从 0 号房间开始,拿到钥匙 1
之后我们去 1 号房间,拿到钥匙 2
然后我们去 2 号房间,拿到钥匙 3
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true

示例 2:

1
2
3
输入: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] 的值 互不相同

DFS

每访问一个房间就遍历房间里能到达的房间

访问过的房间需要去重,采用visited数组

如果最终所有房间的visited都为true,返回true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
boolean flag = false;
boolean[] visited;
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
visited = new boolean[rooms.size()];
dfs(rooms, 0);
for(int i = 0 ; i < visited.length; i++){
if(!visited[i]) return false;
}
return true;
}

public void dfs(List<List<Integer>> rooms, int index){
if(visited[index]){ //访问过的点直接return,避免循环
return;
}
visited[index] = true;

for(int i : rooms.get(index)){
dfs(rooms, i);
}
}
}

钥匙和房间
http://example.com/2023/09/21/算法/图/9. 钥匙和房间/
作者
PALE13
发布于
2023年9月21日
许可协议