LC841.钥匙和房间
LC841.钥匙和房间
思路1:DFS
- 此题的关键在于联想转化成图的遍历问题。
- 等价于图的遍历,
rooms[i]
里面放着t1, t2, t3
, 表示从i
出发,到t1, t2, t3
的三条有向边 - 如果可以遍历所有的节点,就能够去到所有的房间
- 第一个示例
[[1], [2], [3], []]
可以转化成以下的图。
代码:
class Solution {
public:
void dfs(vector<vector<int>>& rooms, vector<bool>& vis, int cur_pos) {
vis[cur_pos] = true;
vector<int> nxt_pos = rooms[cur_pos];
for (int i = 0, n = nxt_pos.size(); i < n; i++) {
if (!vis[nxt_pos[i]])
dfs(rooms, vis, nxt_pos[i]);
}
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
// 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边
// 如果可以遍历所有的节点,就能够去到所有的房间
int n = rooms.size();
vector<bool> vis(n, false);
dfs(rooms, vis, 0);
for (int i = 0; i < n; i++) {
if (vis[i] == false) {
return false;
}
}
return true;
}
};
思路2:BFS
- 相当于图的BFS
有了联想就不难了
代码2:
class Solution {
public:
void bfs(vector<vector<int>>& rooms, vector<bool>& vis) {
queue<int> q;
q.push(0);
vis[0] = true;
while (!q.empty()) {
for (int i = 0, qn = q.size(); i < qn; i++) {
int cur_pos = q.front();
q.pop();
for (int k = 0, nr = rooms[cur_pos].size(); k < nr; k++) {
if (!vis[rooms[cur_pos][k]]) {
q.push(rooms[cur_pos][k]);
vis[rooms[cur_pos][k]] = true;
}
}
}
}
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
// 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边
// 如果可以遍历所有的节点,就能够去到所有的房间
int n = rooms.size();
vector<bool> vis(n, false);
bfs(rooms, vis);
for (int i = 0; i < n; i++) {
if (vis[i] == false) {
return false;
}
}
return true;
}
};