leetcode 130. Surrounded Regions | 130. 被围绕的区域(DFS递归“感染“思路)

x33g5p2x  于2021-11-12 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(273)

题目

https://leetcode.com/problems/surrounded-regions/

题解

Related Topics 说是并查集问题,然而我并没有用到。
带有 visited 数组的 DFS 时间复杂度应该是 O(M*N),因为每个坐标只被 visit 过 2 遍。

有点像围棋,只要我是活的,那么我能伸展到的位置就都是活的。
最初始的时候,有哪些是活的呢?那就是所有边沿上的 O。让它们去 DFS 做伸展,所以这是一个感染的过程。

或者可以这样想,只有能和上下左右边缘 接壤 的 ‘O’ 能够存活,所以不用去管中间的 O,只要让活着的 O,去感染相邻上下左右的 O,被感染的 O 就能存活,最后没有被感染的 O 就会挂掉,变成 X。

  1. class Solution {
  2. int M, N;
  3. public void solve(char[][] board) {
  4. M = board.length;
  5. N = board[0].length;
  6. // 从4个边缘向内部"感染"
  7. boolean[][] visited = new boolean[M][N];
  8. boolean[][] alive = new boolean[M][N];
  9. for (int i = 0; i < M; i++) {
  10. dfs(board, i, 0, alive, visited);
  11. dfs(board, i, N - 1, alive, visited);
  12. }
  13. for (int j = 0; j < N; j++) {
  14. dfs(board, 0, j, alive, visited);
  15. dfs(board, M - 1, j, alive, visited);
  16. }
  17. // build return matrix
  18. for (int i = 0; i < M; i++) {
  19. for (int j = 0; j < N; j++) {
  20. if (!alive[i][j]) board[i][j] = 'X';
  21. }
  22. }
  23. }
  24. public void dfs(char[][] board, int i, int j, boolean[][] alive, boolean[][] visited) {
  25. if (i < 0 || i == M || j < 0 || j == N || visited[i][j]) return;
  26. visited[i][j] = true;
  27. if (board[i][j] == 'O') {
  28. alive[i][j] = true;
  29. dfs(board, i - 1, j, alive, visited);
  30. dfs(board, i + 1, j, alive, visited);
  31. dfs(board, i, j - 1, alive, visited);
  32. dfs(board, i, j + 1, alive, visited);
  33. }
  34. }
  35. }

相关文章