Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
有 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 号房间。
提示:
n == rooms.length 2 <= n <= 1000 0 <= rooms[i].length <= 1000 1 <= sum(rooms[i].length) <= 3000 0 <= rooms[i][j] < n 所有 rooms[i] 的值 互不相同
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ke… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
用队列记录可访问房间,每次从队列中取出一个元素,访问该房间,取得新的钥匙再加入队列中,直到无房间可再访问。
最后判断是否所有房间都被访问过。
具体实现: 拿到队头房间号,如果房间已访问过,无需再次访问,继续 如果放假没有访问过,得到当前房间里的钥匙,并将当前房间的钥匙加入到待访问队列,当前房间访问完标记,最后判断是否所有房间都被访问过
三、AC 代码:
class Solution {
private void dfs(int i, boolean[] marked, List<List<Integer>> rooms) {
marked[i] = true;
for (int j : rooms.get(i)) {
if (!marked[j]) {
dfs(j, marked, rooms);
}
}
}
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
boolean[] marked = new boolean[rooms.size()];
dfs(0, marked, rooms);
for (boolean flag : marked) {
if (!flag) return false;
}
return true;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐