有 n
个房间,房间按从 0
到 n - 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 号房间。
思路:使用深度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 visit 记录当前节点是否访问过,避免重复访问
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;
}
};
分析复杂度:
(2)图的广度优先遍历:
思路:使用广度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 visit 记录当前节点是否访问过,避免重复访问
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;
}
};
分析复杂度:
推荐和参考文章:
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/
原文地址:https://blog.csdn.net/weixin_41987016/article/details/134639679
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_2543.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!