841. Keys and Rooms
DifficultyMedium
Description
There are n rooms labeled from 0 to n - 1 and all the rooms are locked except for room 0. Your goal is to visit all the rooms. However, you cannot enter a locked room without having its key.
When you visit a room, you may find a set of distinct keys in it. Each key has a number on it, denoting which room it unlocks, and you can take all of them with you to unlock the other rooms.
Given an array rooms where rooms[i] is the set of keys that you can obtain if you visited room i, return true if you can visit all the rooms, or false otherwise.
Example 1:
Input: rooms = [[1],[2],[3],[]] Output: true Explanation: We visit room 0 and pick up key 1. We then visit room 1 and pick up key 2. We then visit room 2 and pick up key 3. We then visit room 3. Since we were able to visit every room, we return true.
Example 2:
Input: rooms = [[1,3],[3,0,1],[2],[0]] Output: false Explanation: We can not enter room number 2 since the only key that unlocks it is in that room.
Constraints:
n == rooms.length2 <= n <= 10000 <= rooms[i].length <= 10001 <= sum(rooms[i].length) <= 30000 <= rooms[i][j] < n- All the values of
rooms[i]are unique.
Solutions
Solution 1: Depth-First Search (DFS)
Thinking
Rooms form a directed graph whose edges are keys. We ask whether \(0\) reaches every room. \(n\le 1000\), so one traversal is enough.
DFS from \(0\) follows keys; success is \(|\textit{vis}|=n\).
We can use the Depth-First Search (DFS) method to traverse the entire graph, count the number of reachable nodes, and use an array vis to mark whether the current node has been visited to prevent repeated visits.
Finally, we count the number of visited nodes. If it is the same as the total number of nodes, it means that all nodes can be visited; otherwise, there are nodes that cannot be reached.
The time complexity is \(O(n + m)\), and the space complexity is \(O(n)\), where \(n\) is the number of nodes, and \(m\) is the number of edges.
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Solution 2: BFS
Thinking
Solution 1 follows keys with an explicit stack. The same reachability is a queue: start at \(0\) and enqueue a room when a key to it is found and that room is still unvisited. The visited marks still drop duplicate keys, and the answer still compares the visited count with \(n\).
We can also use the Breadth-First Search (BFS) method to traverse the entire graph. We use a hash table or an array vis to mark whether the current node has been visited to prevent repeated visits.
Specifically, we define a queue \(q\), initially put node \(0\) into the queue, and then continuously traverse the queue. Each time we take out the front node \(i\) of the queue, if \(i\) has been visited, we skip it directly; otherwise, we mark it as visited, and then add the nodes that \(i\) can reach to the queue.
Finally, we count the number of visited nodes. If it is the same as the total number of nodes, it means that all nodes can be visited; otherwise, it means that there are unreachable nodes.
The time complexity is \(O(n + m)\), and the space complexity is \(O(n)\). Where \(n\) is the number of nodes, and \(m\) is the number of edges.
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Solution 3: Explicit Stack
Thinking
Rooms form a directed graph whose edges are keys. The question is whether room \(0\) reaches every room. With \(n \le 1000\), one traversal is enough. Following a chain of keys by recursion uses a call depth equal to the room count and overflows Python once the chain reaches length \(1000\). A stack therefore holds the rooms still to open: a popped room is skipped when it was already visited, and otherwise it is marked and its keys are pushed. Duplicate keys may push the same room again, and the mark expands it only once. Every room is reachable when the visited count equals \(n\).
Start at room \(0\) and walk the reachable rooms with an explicit stack. The stack begins with \(0\). When room \(i\) is popped, skip it if it has already been visited; otherwise mark it and push the room behind each key found in \(i\). A repeated key only pushes that room again, and the later pop is skipped.
Finally, check whether every room was visited. If so, return true; otherwise some room cannot be reached.
The time complexity is \(O(n + m)\), and the space complexity is \(O(n)\), where \(n\) is the number of nodes, and \(m\) is the number of edges.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |