841. 钥匙和房间
一、题目
有 n
个房间,房间按从 0
到 n - 1
编号。最初,除 0
号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。
当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。
给你一个数组 rooms
其中 rooms[i]
是你进入 i
号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true
,否则返回 false
。
二、思路
这样一来,问题就变成了给定一张有向图,询问从 0 号节点出发是否能够到达所有的节点。
三、代码
class Solution { public: bool canVisitAllRooms(vector<vector<int>>& rooms) { int n = rooms.size(), num = 0; vector<int> vis(n); queue<int> que; vis[0] = true; que.emplace(0); while (!que.empty()) { int x = que.front(); que.pop(); num++; for (auto& it : rooms[x]) { if (!vis[it]) { vis[it] = true; que.emplace(it); } } } return num == n; } };
四、分析
复杂度分析
时间复杂度:O(n+m),其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数。
空间复杂度:O(n),其中 n 是房间的数量。主要为队列的开销。