leetcode130. 被围绕的区域

举报
兔老大 发表于 2021/04/30 04:10:58 2021/04/30
【摘要】 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 运行你的函数后,矩阵变为: X X X X X X X X X X X X X O X X 解释: 被围绕的区间不...

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

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

示例:

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

X X X X
X X X X
X X X X
X O X X
解释:

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

思路:我们发现,没有被“围绕”的‘o’就是和边界连接的。比如如下情况:

X X O X
X O O X
X X O X
X O O X

'O'不会被改变,因为和边界的‘O’连接,没有被‘X’围绕。

所以,我们从边界开始dfs,把遇到的“O”变为“#”代表和边界相连。

然后遍历数组,把''O'变为X(因为不和边界相连),把#变为X(因为和边界相连)。


  
  1. class Solution {
  2. public void solve(char[][] board) {
  3. if (board == null || board.length == 0) return;
  4. int m = board.length;
  5. int n = board[0].length;
  6. for (int i = 0; i < m; i++) {
  7. for (int j = 0; j < n; j++) {
  8. // 从边缘开始搜索
  9. if ((i == 0 || j == 0 || i == m - 1 || j == n - 1) && board[i][j] == 'O') {
  10. dfs(board, i, j);
  11. }
  12. }
  13. }
  14. for (int i = 0; i < m; i++) {
  15. for (int j = 0; j < n; j++) {
  16. //没有被搜索到过,不和边界连接
  17. if (board[i][j] == 'O') {
  18. board[i][j] = 'X';
  19. }
  20. //被改变过,和边界连接
  21. if (board[i][j] == '#') {
  22. board[i][j] = 'O';
  23. }
  24. }
  25. }
  26. }
  27. public void dfs(char[][] board, int i, int j) {
  28. if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] == 'X' || board[i][j] == '#') {
  29. // board[i][j] == '#' 说明已经搜索过了.
  30. return;
  31. }
  32. board[i][j] = '#';
  33. dfs(board, i - 1, j); // 上
  34. dfs(board, i + 1, j); // 下
  35. dfs(board, i, j - 1); // 左
  36. dfs(board, i, j + 1); // 右
  37. }
  38. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104359123

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。