LC841.钥匙和房间

LC841.钥匙和房间
image.png

思路1:DFS

  • 此题的关键在于联想转化成图的遍历问题。
  • 等价于图的遍历,rooms[i] 里面放着t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边
  • 如果可以遍历所有的节点,就能够去到所有的房间
  • 第一个示例[[1], [2], [3], []]可以转化成以下的图。

image.png

代码:

  1. class Solution {
  2. public:
  3. void dfs(vector<vector<int>>& rooms, vector<bool>& vis, int cur_pos) {
  4. vis[cur_pos] = true;
  5. vector<int> nxt_pos = rooms[cur_pos];
  6. for (int i = 0, n = nxt_pos.size(); i < n; i++) {
  7. if (!vis[nxt_pos[i]])
  8. dfs(rooms, vis, nxt_pos[i]);
  9. }
  10. }
  11. bool canVisitAllRooms(vector<vector<int>>& rooms) {
  12. // 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边
  13. // 如果可以遍历所有的节点,就能够去到所有的房间
  14. int n = rooms.size();
  15. vector<bool> vis(n, false);
  16. dfs(rooms, vis, 0);
  17. for (int i = 0; i < n; i++) {
  18. if (vis[i] == false) {
  19. return false;
  20. }
  21. }
  22. return true;
  23. }
  24. };

思路2:BFS

  • 相当于图的BFS
  • 有了联想就不难了

    代码2:

    1. class Solution {
    2. public:
    3. void bfs(vector<vector<int>>& rooms, vector<bool>& vis) {
    4. queue<int> q;
    5. q.push(0);
    6. vis[0] = true;
    7. while (!q.empty()) {
    8. for (int i = 0, qn = q.size(); i < qn; i++) {
    9. int cur_pos = q.front();
    10. q.pop();
    11. for (int k = 0, nr = rooms[cur_pos].size(); k < nr; k++) {
    12. if (!vis[rooms[cur_pos][k]]) {
    13. q.push(rooms[cur_pos][k]);
    14. vis[rooms[cur_pos][k]] = true;
    15. }
    16. }
    17. }
    18. }
    19. }
    20. bool canVisitAllRooms(vector<vector<int>>& rooms) {
    21. // 等价于图的遍历,rooms[i] 里面放着 t1, t2, t3, 表示从i出发,到t1, t2, t3的三条有向边
    22. // 如果可以遍历所有的节点,就能够去到所有的房间
    23. int n = rooms.size();
    24. vector<bool> vis(n, false);
    25. bfs(rooms, vis);
    26. for (int i = 0; i < n; i++) {
    27. if (vis[i] == false) {
    28. return false;
    29. }
    30. }
    31. return true;
    32. }
    33. };