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