The solution is oddly very similar to Binary Tree Level Order Traversal

class Solution(object):def canVisitAllRooms(self, rooms):"""https://leetcode.com/problems/keys-and-rooms/description/:type rooms: List[List[int]]:rtype: bool"""level = rooms[0]rooms[0] = []le = len(rooms)unlocked = [False]*leunlocked[0] = Truecn = 1while level:# print(level)temp = set()for i in level:if unlocked[i] == False:unlocked[i] = Truecn += 1temp |= set(rooms[i])rooms[i] = []level = tempreturn cn == le

Since we have keys to the first room we store those in `level`

. We then iterate through the list of available keys and for each room visited we add its keys into `temp`

. At the end of iteration, `temp`

contains the list of all the new keys we have received and we store them back into `level`

for the next iteration. We repeat this until we run out of keys.

Each time we add a key to `temp`

we check if we have seen that key before and if not, we append a counter `cn`

that maintains the number of rooms unlocked. If in the end this counter is equal to the number of rooms in the list we return `True`

else `False`

Time Complexity:O(N) where N is the number of rooms

Space Complexity:O(N)