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;
    }
}
相关推荐
毕设源码-邱学长5 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
I_LPL7 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
兑生7 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu7 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
颜酱7 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073218 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
零雲8 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
2401_831824969 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you10 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_4160187210 小时前
C++中的状态模式
开发语言·c++·算法