临接表-钥匙与房间-841

164 阅读2分钟

841. 钥匙和房间

有 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
};
  1. 这道题目背后的抽象出临街矩阵才是难度所在
  2. 其次忽略了题目已知,第0号房间一定存在
  3. 这道题目其实就是入队列是房间,出队列的是钥匙,但是其实钥匙就是对应房间
  4. 其次利用了哈希表,表示,是否每一个房间都已经访问过,。以后判断某个元素是否访问,就联想哈希表