2026年--Lc342-841. 钥匙和房间(图 - 广度优先搜索)--java版

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;
    }
}
相关推荐
孟陬2 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌2 小时前
一站式了解四种限流算法
java·后端·go
华仔啊2 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝3 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
Gorway3 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风3 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect3 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
Nyarlathotep01134 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen54 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java