假设我们有一个称为房间的列表列表。rooms 中的每个索引 i 代表一个房间,rooms[i] 代表打开其他房间的不同键。房间 0 是开放的,我们在那个房间,其他房间都被锁上了。我们可以在打开的房间之间自由移动;我们必须检查我们是否可以打开每个房间。
因此,如果输入类似于 rooms = [[2, 0], [3],[1],[]],那么输出将为 True,因为我们从房间 0 开始,可以用它的钥匙去房间 2 2. 从2号房可以到1号房,然后拿3号房的钥匙打开。所以都打开了。
为了解决这个问题,我们将按照以下步骤操作:
n := 房间大小
准备好 := 单个元素 0 的列表
看到 := 一组新的
而 ready 不是空的,做
如果没有看到 v,那么
在准备好的末尾插入 v
u := ready 的最后一个元素并将其从 ready 中删除
将你标记为所见
对于房间[u]中的每个v,做
当看到的大小与 n 相同时返回真,否则返回假。
让我们看下面的实现来更好地理解:
class Solution: def solve(self, rooms): n = len(rooms) ready = [0] seen = set() while ready: u = ready.pop() seen.add(u) for v in rooms[u]: if v not in seen: ready.append(v) return len(seen) == n ob = Solution() rooms = [ [2, 0], [3], [1], [] ] print(ob.solve(rooms))
rooms = [[2, 0],[3],[1],[]]输出结果
True