1.题目

2.思路
最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
当 x 号房间中有 y 号房间的钥匙时,我们就可以从 x 号房间去往 y 号房间。如果我们将这 n 个房间看成有向图中的 n 个节点,那么上述关系就可以看作是图中的 x 号点到 y 号点的一条有向边。这样一来,问题就变成了给定一张有向图,询问从 0 号节点出发是否能够到达所有的节点。
时间复杂度:O(N + K),N:房间数,K:钥匙总数。时间复杂度 = 程序执行的"基本操作"次数,随输入规模增长的上界,不是只看 for,而是
所有会随 N 或 K 增长的操作,都要算进去。
空间复杂度:O(N),vis 数组 + 队列
3.代码实现
java
class Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
int n= rooms.size();
int cnt=0;
boolean[] vis = new boolean[n];
Queue<Integer> qu=new LinkedList<Integer>();
vis[0]=true;//被访问过的节点置为1
qu.offer(0);
while(!qu.isEmpty())
{//队列的首元素删除,并返回值
int x=qu.poll();//x当前访问的房间
cnt++;//访问房间数 +1
for(int mm:rooms.get(x))
{
if(vis[mm]==false)//进入新房间(如果没访问过)
{
vis[mm]=true;//标记为访问过
qu.offer(mm);//加入队列,之后再继续探索
}
}
}
if(cnt==n)//如果访问过的房间数 = 房间总数, 所有房间都能访问到
{
return true;
}
return false;
}
}