less than 1 minute read

Problem Statement

leetcode problem link

My Solution [Accepted]

class Solution:
    def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
        graph = defaultdict(list)
        for i, keys in enumerate(rooms):
            graph[i] = keys[:]

        visited = set()

        def dfs(index):
            visited.add(index)
            for nei in graph[index]:
                if nei not in visited:
                    dfs(nei)

        dfs(0)
        return len(rooms) == len(visited)

Editorial

class Solution(object):
    def canVisitAllRooms(self, rooms):
        seen = [False] * len(rooms)
        seen[0] = True
        stack = [0]
        #At the beginning, we have a todo list "stack" of keys to use.
        #'seen' represents at some point we have entered this room.
        while stack:  #While we have keys...
            node = stack.pop() # get the next key 'node'
            for nei in rooms[node]: # For every key in room # 'node'...
                if not seen[nei]: # ... that hasn't been used yet
                    seen[nei] = True # mark that we've entered the room
                    stack.append(nei) # add the key to the todo list
        return all(seen) # Return true iff we've visited every room