有 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 号房间。
function canVisitAllRooms(rooms: number[][]): boolean {
// 领接表--由实际案例抽象数据结构
// 选取 bfs 算法
let queue = [0];
let visited: Array<any> = []
rooms.forEach((item, index) => {
visited[index] = false
})
visited[0] = true
while (queue.length > 0) {
let item = queue.shift();
while (rooms[item].length > 0) {
const key = rooms[item].shift()
visited[key] = true
queue.push(key)
}
}
if (visited.includes(false)) {
return false
}
return true
};
- 这道题目背后的抽象出临街矩阵才是难度所在
- 其次忽略了题目已知,第0号房间一定存在
- 这道题目其实就是入队列是房间,出队列的是钥匙,但是其实钥匙就是对应房间
- 其次利用了哈希表,表示,是否每一个房间都已经访问过,。以后判断某个元素是否访问,就联想哈希表