leetCode 841. 钥匙和房间 图遍历 深度优先遍历+广度优先遍历 + 图解

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

n 个房间,房间按从0n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true ,否则返回 false


示例 1:

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

示例 2:

复制代码
输入:rooms = [[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。


(1)图的深度优先遍历:

思路:使用深度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 visit 记录当前节点是否访问过,避免重复访问

cpp 复制代码
class Solution {
public:
    vector<bool> visit;
    int visCount=0;
    void dfs(vector<vector<int>>& rooms,int roomId){
        visit[roomId] = true;
        visCount++;
        for(auto& roomKey:rooms[roomId]) {
            if(!visit[roomKey]) {
                dfs(rooms,roomKey);
            }
        }
    }
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        int n = rooms.size();// 房间个数
        visit.resize(n);
        dfs(rooms,0);
        return visCount == n;
    }
};

分析复杂度:

  • 时间 复杂度:O(n+m) ,其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数
  • 空间 复杂度:O(n) ,其中 n 是房间的数量,主要为栈的开销

(2)图的广度优先遍历:

思路:使用广度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 visit 记录当前节点是否访问过,避免重复访问

cpp 复制代码
class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        int n = rooms.size(),visCount=0;
        vector<bool> visit(n,0);
        visit[0]=true;
        queue<int> Q;
        Q.emplace(0);
        while(!Q.empty()) {
            int roomId = Q.front();
            Q.pop();
            visCount++;
            for(auto& roomKey : rooms[roomId]) {
                if(!visit[roomKey]) {
                    visit[roomKey] = true;
                    Q.emplace(roomKey);
                }
            }   
        }
        return visCount==n;
    }
};

分析复杂度:

  • 时间 复杂度:O(n+m) ,其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数
  • 空间 复杂度:O(n) ,其中 n 是房间的数量,主要为队列的开销

推荐和参考文章:

841. 钥匙和房间 - 力扣(LeetCode)https://leetcode.cn/problems/keys-and-rooms/solutions/395157/shou-hua-tu-jie-you-xiang-tu-de-bian-li-yi-jing-ge/841. 钥匙和房间 - 力扣(LeetCode)https://leetcode.cn/problems/keys-and-rooms/solutions/393524/yao-chi-he-fang-jian-by-leetcode-solution/

相关推荐
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
TracyCoder1234 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
草履虫建模11 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
VT.馒头15 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
WHD30619 小时前
苏州误删除 格式化 服务器文件 恢复
随机森林·支持向量机·深度优先·爬山算法·宽度优先·推荐算法·最小二乘法
不穿格子的程序员19 小时前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
VT.馒头1 天前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript
执着2591 天前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
52Hz1181 天前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
苦藤新鸡1 天前
56.组合总数
数据结构·算法·leetcode