841. 钥匙和房间

841. 钥匙和房间

方法一:深度优先搜索

思路及解法

我们可以使用深度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 vis 标记当前节点是否访问过,以防止重复访问。

class Solution {
public:
    vector<int> vis;
    int num;

    void dfs(vector<vector<int> >& rooms, int x) {
        vis[x] = true;
        num++;
        for (int i = 0; i < rooms[x].size(); i++)
            if (!vis[rooms[x][i]])
                dfs(rooms, rooms[x][i]);
    }

    bool canVisitAllRooms(vector<vector<int> >& rooms) {
        int n = rooms.size();
        num = 0;
        vis.resize(n);
        dfs(rooms, 0);
        return num == n;
    }
};

 

复杂度分析

时间复杂度:O(n+m),其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数。

空间复杂度:O(n),其中 n是房间的数量。主要为栈空间的开销。

 

方法二:广度优先搜索


思路及解法

我们也可以使用广度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组vis 标记当前节点是否访问过,以防止重复访问。

 

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int> >& rooms) {
        int n=rooms.size();
        int num=0;
        queue<int>que;
        que.push(0);
        vector<bool>vis(n);
        vis[0]=true;
        while (!que.empty())
        {
            int front = que.front();
            que.pop();
            num++;
            for (int i = 0; i < rooms[front].size(); i++)
            {
                
                if(!vis[rooms[front][i]]){
                    que.push(rooms[front][i]);
                    vis[rooms[front][i]]=true;
                }
            }
        }
        return num==n;
    }
};

 

复杂度分析

时间复杂度:O(n+m),其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数。

空间复杂度:O(n),其中 n是房间的数量。主要为栈空间的开销。

 

因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13735418.html

原文地址:https://www.cnblogs.com/BlairGrowing/p/13735418.html