题目链接 : https://leetcode-cn.com/problems/surrounded-regions/

题目描述:

给定一个二维的矩阵,包含 'X''O'字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例:

示例:

  1. X X X X
  2. X O O X
  3. X X O X
  4. X O X X

运行你的函数后,矩阵变为:

  1. X X X X
  2. X X X X
  3. X X X X
  4. X O X X

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路:

从边界出发把,先把边界上和O连通点找到, 把这些变成B,然后遍历整个boardO变成X, 把B变成O

如下图所示

所以这样就有2种方法

思路一: DFS

思路二: BFS

还有一种就是, 把边界O并且与它连通这些点分在一起

思路三 : 并查集

代码:

思路一:

  1. class Solution:
  2. def solve(self, board: List[List[str]]) -> None:
  3. """
  4. Do not return anything, modify board in-place instead.
  5. """
  6. if not board or not board[0]:
  7. return
  8. row = len(board)
  9. col = len(board[0])
  10. def dfs(i, j):
  11. board[i][j] = "B"
  12. for x, y in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
  13. tmp_i = i + x
  14. tmp_j = j + y
  15. if 1 <= tmp_i < row and 1 <= tmp_j < col and board[tmp_i][tmp_j] == "O":
  16. dfs(tmp_i, tmp_j)
  17. for j in range(col):
  18. # 第一行
  19. if board[0][j] == "O":
  20. dfs(0, j)
  21. # 最后一行
  22. if board[row - 1][j] == "O":
  23. dfs(row - 1, j)
  24. for i in range(row):
  25. # 第一列
  26. if board[i][0] == "O":
  27. dfs(i, 0)
  28. # 最后一列
  29. if board[i][col-1] == "O":
  30. dfs(i, col - 1)
  31. for i in range(row):
  32. for j in range(col):
  33. # O 变成 X
  34. if board[i][j] == "O":
  35. board[i][j] = "X"
  36. # B 变成 O
  37. if board[i][j] == "B":
  38. board[i][j] = "O"

java

  1. class Solution {
  2. int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
  3. public void solve(char[][] board) {
  4. if (board == null || board.length == 0 || board[0] == null || board[0].length == 0) return;
  5. int row = board.length;
  6. int col = board[0].length;
  7. for (int j = 0; j < col; j++) {
  8. // 第一行
  9. if (board[0][j] == 'O') dfs(0, j, board, row, col);
  10. // 最后一行
  11. if (board[row - 1][j] == 'O') dfs(row - 1, j, board, row, col);
  12. }
  13. for (int i = 0; i < row; i++) {
  14. // 第一列
  15. if (board[i][0] == 'O') dfs(i, 0, board, row, col);
  16. // 最后一列
  17. if (board[i][col - 1] == 'O') dfs(i, col - 1, board, row, col);
  18. }
  19. // 转变
  20. for (int i = 0; i < row; i++) {
  21. for (int j = 0; j < col; j++) {
  22. if (board[i][j] == 'O') board[i][j] = 'X';
  23. if (board[i][j] == 'B') board[i][j] = 'O';
  24. }
  25. }
  26. }
  27. private void dfs(int i, int j, char[][] board, int row, int col) {
  28. board[i][j] = 'B';
  29. for (int[] dir : dirs) {
  30. int tmp_i = dir[0] + i;
  31. int tmp_j = dir[1] + j;
  32. if (tmp_i < 0 || tmp_i >= row || tmp_j < 0 || tmp_j >= col || board[tmp_i][tmp_j] != 'O') continue;
  33. dfs(tmp_i, tmp_j, board, row, col);
  34. }
  35. }
  36. }

思路二:

  1. class Solution:
  2. def solve(self, board: List[List[str]]) -> None:
  3. """
  4. Do not return anything, modify board in-place instead.
  5. """
  6. if not board or not board[0]:
  7. return
  8. row = len(board)
  9. col = len(board[0])
  10. def bfs(i, j):
  11. from collections import deque
  12. queue = deque()
  13. queue.appendleft((i, j))
  14. while queue:
  15. i, j = queue.pop()
  16. if 0 <= i < row and 0 <= j < col and board[i][j] == "O":
  17. board[i][j] = "B"
  18. for x, y in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
  19. queue.appendleft((i + x, j + y))
  20. for j in range(col):
  21. # 第一行
  22. if board[0][j] == "O":
  23. bfs(0, j)
  24. # 最后一行
  25. if board[row - 1][j] == "O":
  26. bfs(row - 1, j)
  27. for i in range(row):
  28. if board[i][0] == "O":
  29. bfs(i, 0)
  30. if board[i][col - 1] == "O":
  31. bfs(i, col - 1)
  32. for i in range(row):
  33. for j in range(col):
  34. if board[i][j] == "O":
  35. board[i][j] = "X"
  36. if board[i][j] == "B":
  37. board[i][j] = "O"

java

  1. class Solution {
  2. int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
  3. private static class Point {
  4. int x, y;
  5. Point(int x, int y) {
  6. this.x = x;
  7. this.y = y;
  8. }
  9. }
  10. public void solve(char[][] board) {
  11. if (board == null || board.length == 0 || board[0] == null || board[0].length == 0) return;
  12. int row = board.length;
  13. int col = board[0].length;
  14. for (int j = 0; j < col; j++) {
  15. // 第一行
  16. if (board[0][j] == 'O') bfs(0, j, board, row, col);
  17. // 最后一行
  18. if (board[row - 1][j] == 'O') bfs(row - 1, j, board, row, col);
  19. }
  20. for (int i = 0; i < row; i++) {
  21. // 第一列
  22. if (board[i][0] == 'O') bfs(i, 0, board, row, col);
  23. // 最后一列
  24. if (board[i][col - 1] == 'O') bfs(i, col - 1, board, row, col);
  25. }
  26. // 转变
  27. for (int i = 0; i < row; i++) {
  28. for (int j = 0; j < col; j++) {
  29. if (board[i][j] == 'O') board[i][j] = 'X';
  30. if (board[i][j] == 'B') board[i][j] = 'O';
  31. }
  32. }
  33. }
  34. private void bfs(int i, int j, char[][] board, int row, int col) {
  35. Deque<Point> queue = new LinkedList<>();
  36. queue.offer(new Point(i, j));
  37. while (!queue.isEmpty()) {
  38. Point tmp = queue.poll();
  39. if (tmp.x >= 0 && tmp.x < row && tmp.y >= 0 && tmp.y < col && board[tmp.x][tmp.y] == 'O') {
  40. board[tmp.x][tmp.y] = 'B';
  41. for (int[] dir : dirs) queue.offer(new Point(tmp.x + dir[0], tmp.y + dir[1]));
  42. }
  43. }
  44. }
  45. }

思路三:

  1. class Solution:
  2. def solve(self, board: List[List[str]]) -> None:
  3. """
  4. Do not return anything, modify board in-place instead.
  5. """
  6. f = {}
  7. def find(x):
  8. f.setdefault(x, x)
  9. if f[x] != x:
  10. f[x] = find(f[x])
  11. return f[x]
  12. def union(x, y):
  13. f[find(y)] = find(x)
  14. if not board or not board[0]:
  15. return
  16. row = len(board)
  17. col = len(board[0])
  18. dummy = row * col
  19. for i in range(row):
  20. for j in range(col):
  21. if board[i][j] == "O":
  22. if i == 0 or i == row - 1 or j == 0 or j == col - 1:
  23. union(i * col + j, dummy)
  24. else:
  25. for x, y in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
  26. if board[i + x][j + y] == "O":
  27. union(i * col + j, (i + x) * col + (j + y))
  28. for i in range(row):
  29. for j in range(col):
  30. if find(dummy) == find(i * col + j):
  31. board[i][j] = "O"
  32. else:
  33. board[i][j] = "X"

[LeetCode] 130. 被围绕的区域的更多相关文章

  1. Java实现 LeetCode 130 被围绕的区域

    130. 被围绕的区域 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O ...

  2. LeetCode 130. 被围绕的区域(Surrounded Regions)

    题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X ...

  3. Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

    Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...

  4. [LeetCode] 130. Surrounded Regions 包围区域

    Given a 2D board containing 'X' and 'O'(the letter O), capture all regions surrounded by 'X'. A regi ...

  5. 130 Surrounded Regions 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O), 找到所有被 'X' 围绕的区域.并将区域里所有 'O'用 'X' 填充.例如,X X X XX O O XX X O XX O X X运行你 ...

  6. LeetCode 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...

  7. [Swift]LeetCode130. 被围绕的区域 | Surrounded Regions

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  8. lintcode:被围绕的区域

    被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O X X ...

  9. 【1】【leetcode-130】 被围绕的区域

    (DFS思路对,写复杂了) 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O ...

随机推荐

  1. mysql 发现 navicat 可以远程连接,代码无法远程连接

    navicat可以远程连接, root账号也可以用代码连接. 其他的用户无法远程连接. 原因: 1.先检查下 mysql数据库里面 的 servers 表是否存在. 2.更新或者创建用户之后 使用:  ...

  2. aspose 模板输出

    Dictionary<string, string> dictionnaryBig = new Dictionary<string, string>(); dictionnar ...

  3. std::string 和 CString问题

    std::string stdTemp; CString strTemp; strTemp = stdTemp;    ;//这一步直接赋值可不可以 因为CString可以接受const char*的 ...

  4. jodd cache实现缓存超时

    public class JoddCache { private static final int CACHE_SIZE = 2; private final static Cache<Obje ...

  5. Python3学习笔记(七):字典

    在python中,有一种通过名字来引用值的数据结构,这种类型的数据结构成为映射. 字典是Python中唯一内建的映射类型,具有以下特点: 字典中的值是无序的 值存在特定的键(key)下 键(key)可 ...

  6. sqli-lab(37)

    0X01 看看源码 what is mean? 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n ...

  7. Starting MySQL... ERROR! The server quit without updating PID file (/usr/local/mysql/data/VM_0_6_centos.pid)

    刚接触MySql数据库,参考一些文章后搭建起来了也创建了数据库,程序跑到很好,一觉醒来突然连接不上了 MySql数据库了. 研究了好一会才找到原因. 现象: 登录数据库失败 [root@VM_0_6_ ...

  8. Json C#解析

    介绍 项目中数据格式如果是是Json格式,推荐大家使用LitJson和Newtonsoft.json进行解析 库的详细介绍和下载地址 推荐使用VS自带的Nuget来使用 Newtonsoft.Json ...

  9. Arthas随笔

    目录 Arthas 安装Java 安装 Arthas Arthas 命令及示例 源码分析 Arthas 安装Java 下载jdk 注意 下载的JDK版本要与linux操作系统相匹配,否则汇报No su ...

  10. 2018年5月6日GDCPC(广东赛区)总结

    大二第二次参加省赛了,这次成绩不是太理想. ———————————————————————————————— day1:试机 约好的12点钟在地铁站集合,好像就我一个人迟到了5分钟,被sen主席批判一 ...