1. 程式人生 > 實用技巧 >leetcode841 - Keys and Rooms - medium

leetcode841 - Keys and Rooms - medium

There areNrooms and you start in room0. Each room has a distinct number in0, 1, 2, ..., N-1, and each room may havesome keys to access the next room.

Formally, each roomihas a list of keysrooms[i], and each keyrooms[i][j]is an integer in[0, 1, ..., N-1]whereN = rooms.length. A keyrooms[i][j] = vopens the room with numberv

.

Initially, all the rooms start locked (except for room0).

You can walk back and forth between rooms freely.

Returntrueif and only if you can enterevery room.

Example 1:

Input: [[1],[2],[3],[]]
Output: true
Explanation:  
We start in room 0, and pick up key 1.
We then go to room 1, and pick up key 2.
We then go to room 2, and pick up key 3.
We then go to room 3.  Since we were able to go to every room, we return true.

Example 2:

Input: [[1,3],[3,0,1],[2],[0]]
Output: false
Explanation: We can't enter the room with number 2.

Note:

  1. 1 <= rooms.length <=1000
  2. 0 <= rooms[i].length <= 1000
  3. The number of keys in all rooms combined is at most3000.
Graph traversal模板題, 關鍵點就是圖中可能存在環,避免同一節點重複搜尋就行。 DFS實現:
class Solution {
private: void dfs(vector<vector<int>>& rooms, unordered_set<int>& visited, int cur){ visited.insert(cur); for (int key : rooms[cur]){ if (visited.find(key) == visited.end()) dfs(rooms, visited, key); } } public: bool canVisitAllRooms(vector<vector<int>>& rooms) { unordered_set<int> visited; dfs(rooms, visited, 0); return visited.size() == rooms.size(); } };

BFS實現:

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        unordered_set<int> visited{0};
        queue<int> q;
        q.push(0);
        while (!q.empty()){
            int cur = q.front();
            q.pop();
            for (int key : rooms[cur]){
                if (visited.count(key))
                    continue;
                visited.insert(key);
                q.push(key);
            }
        }
        return visited.size() == rooms.size();
    }
};