• 841. Keys and Rooms


    use std::collections::HashSet;
    use std::collections::VecDeque;
    
    /**
    841. Keys and Rooms
    https://leetcode.com/problems/keys-and-rooms/
    
    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:
    1. n == rooms.length
    2. 2 <= n <= 1000
    3. 0 <= rooms[i].length <= 1000
    4. 1 <= sum(rooms[i].length) <= 3000
    5. 0 <= rooms[i][j] < n
    6. All the values of rooms[i] are unique.
    */
    pub struct Solution {}
    
    impl Solution {
        /*
        Solution: scan each level to check if contains all room num by DFS or BFS;
        M is size of rooms, N is maximum size of rooms's element;
        Time:O(M*N), Space:O(N);
        */
        pub fn can_visit_all_rooms(rooms: Vec<Vec<i32>>) -> bool {
            let mut visited: HashSet<i32> = HashSet::new();
            //Self::dfs(0, &rooms, &mut visited);
            //visited.len() == rooms.len()
            Self::bfs(0, &rooms, &mut visited)
        }
    
        fn dfs(key: i32, rooms: &Vec<Vec<i32>>, visited: &mut HashSet<i32>) {
            if visited.contains(&key) {
                return;
            }
            visited.insert(key);
            for i in &rooms[key as usize] {
                Self::dfs(*i, rooms, visited)
            }
        }
    
        /*
        Use a queue to keep the keys we found in a room, only enqueue the keys not visited yet.
        Repeat until the queue is empty, and check if size of visited set equals size of rooms.
        */
        fn bfs(key: i32, rooms: &Vec<Vec<i32>>, visited: &mut HashSet<i32>) -> bool {
            let mut queue: VecDeque<i32> = VecDeque::new();
            queue.push_back(0);
            while !queue.is_empty() {
                let top = queue.pop_front().unwrap();
                visited.insert(top);
                for i in &rooms[top as usize] {
                    if (visited.contains(i)) {
                        continue;
                    }
                    queue.push_back(*i);
                }
            }
            rooms.len() == visited.len()
        }
    }
  • 相关阅读:
    剑指offer编程题66道题 26-35
    剑指offer编程题66道题 1-25
    springboot的自动配置
    用智能的编译器来防错
    实现迭代器的捷径
    结束C#2的讲解:最后的一些特性
    进入快速委托通道
    可空类型
    用泛型实现参数化类型
    C#1所搭建的核心基础
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15999340.html
Copyright © 2020-2023  润新知