841. Keys and Rooms
Description of Problem
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.
Solution
Tags: Depth First Search Graph Theory
Explanation
We use the same manner in 547. Number of Provinces. Perform depth-first-serach on node 0 and see whether all nodes are black.
Code (Rust)
#[derive(Clone, Copy, Debug, PartialEq)]
enum Colour{
White,
Gray,
Black,
}
use Colour::{White, Gray, Black};
impl Solution {
pub fn can_visit_all_rooms(rooms: Vec<Vec<i32>>) -> bool {
let n = rooms.len();
let mut colour = vec![White ; n];
Self::dfs(0, &rooms, &mut colour);
return colour.into_iter().all(|c| c == Black);
}
fn dfs(n : usize, rooms : &Vec<Vec<i32>>, colour : &mut Vec<Colour>) {
colour[n] = Gray;
for &i in rooms[n].iter() {
let i = i as usize;
if colour[i] == White {
Self::dfs(i, rooms, colour);
}
}
colour[n] = Black;
}
}
Complexity
- \(|V|\) is the number of nodes
- \(|E|\) is the number of edges
Time Complexity
- \( T(|V|,|E|) = \Theta(|V|) \)
Auxiliary Space
- \(S(|V|,|E|) = \Theta(|V|)\)
- Keep track of node colours