1. 被围绕的区域
    给定一个二维的矩阵,包含 ‘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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

就是先从边界出发,把能连接到0全部标记,最后就只剩下内部的0,最后再统一处理即可

class Solution {int m, n;int[][] mp = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};public void solve(char[][] board) {m = board.length;if(m == 0) return;//注意如果为0,这句应该放在前面n = board[0].length;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(i == 0 || i == m - 1 || j == 0 || j == n - 1){//只有在边界才可以遍历if(board[i][j] == 'O') dfs(board, i, j);//只有该位置为o才遍历}}}//不能修改的都已经被标记for(int i = 0; i <m; i++){for(int j = 0; j < n; j++){if(board[i][j] == 'O') board[i][j] = 'X';//顺序千万不能颠倒了if(board[i][j] == '#') board[i][j] = 'O';}}}void dfs(char[][] board, int i, int j){if(i < 0 || j < 0 || i >= m || j >= n || board[i][j] == 'X' || board[i][j] == '#'){return;}board[i][j] = '#';//这里并没有回溯,只需要标记即可for(int k = 0; k < 4; k++){int newX = i + mp[k][0];int newY = j + mp[k][1];dfs(board, newX, newY);}}//实际也可以不要边界条件void dfs2(char[][] board, int i, int j){if(!(i < 0 || j < 0 || i >= m || j >= n || board[i][j] == 'X' || board[i][j] == '#')){board[i][j] = '#';for(int k = 0; k < 4; k++){int newX = i + mp[k][0];int newY = j + mp[k][1];dfs(board, newX, newY);}}}
}

2.BFS(新建一个节点,存储坐标)
同样也是从边界出发,标记,只是这是用的是bfs方法,利用队列来存储

import java.util.*;
class Solution {public class Pos{int i;int j;Pos(int i, int j) {this.i = i;this.j = j;}}int[][] mp = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};int m, n;public void solve(char[][] board) {if (board == null || board.length == 0) return;m = board.length;n = board[0].length;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 从边缘第一个是o的开始搜索boolean isEdge = i == 0 || j == 0 || i == m - 1 || j == n - 1;if (isEdge && board[i][j] == 'O') {board[i][j] = '#';//这个不要忘了bfs(board, i, j);//这就是图的遍历方式,不是遍历一次,而是很多次}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == 'O') {board[i][j] = 'X';}if (board[i][j] == '#') {board[i][j] = 'O';}}}}public void bfs(char[][] board, int i, int j) {LinkedList<Pos> q = new LinkedList<>();q.add(new Pos(i, j));//这里就不用计算i * n +m;while(!q.isEmpty()){Pos node = q.poll();int x = node.i;int y = node.j;for(int k = 0; k < 4; k++){int newX = x + mp[k][0];int newY = y + mp[k][1];if(newX >= 0 && newX < m && newY >= 0 && newY < n&& board[newX][newY] == 'O'){board[newX][newY] = '#';q.add(new Pos(newX, newY));}}}}
}

3.并查集

import java.util.*;
//定义一个工具类
class Util{int[] parent;public Util(int n){//只要new一个对象,这些都会被初始化parent = new int[n];//这就是建一个类的好处,不用指定大小//初始化数组for(int i = 0; i < n; i++){parent[i] = i;}}public int finParent(int num){while(num != parent[num]){num = parent[num];}return num;}public void union(int x, int y){int fa = finParent(x);int fb = finParent(y);if(fa != fb){parent[fa] = fb;}}public boolean isConnected(int i, int j){return finParent(i) == finParent(j);}
}
class Solution {int[][] mp = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};int m, n;public void solve(char[][] board) {if (board == null || board.length == 0) return;m = board.length;n = board[0].length;Util util = new Util(m * n + 1);//每一个点都是一个独立的个体,多空出一个位,int sign = m * n;//放这里for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if(board[i][j] == 'O'){if(i == 0 || i == m - 1 || j == 0 || j == n - 1){//如果在边界util.union(node(i, j), sign);}else{//不在边界,同时也为0for (int k = 0; k < 4; k++) {int newX = i + mp[k][0];int newY = j + mp[k][1];if (newX >= 0 && newX < m && newY >= 0 && newY < n&& board[newX][newY] == 'O') {util.union(node(i, j), node(newX, newY));}}}}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (util.isConnected(node(i, j), sign)) {// 和dummyNode 在一个连通区域的,那么就是O;board[i][j] = 'O';} else {board[i][j] = 'X';}}}}int node(int i, int j){return i * n + j;}
}

L130被围绕的区域相关推荐

  1. 130.被围绕的区域

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

  2. 被围绕的区域(dfs)

    原创公众号:bigsai 欢迎加入力扣打卡 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' ...

  3. 【LeetCode】130.被围绕的区域

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

  4. 130. Surrounded Regions 被围绕的区域

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

  5. leetcode--130. 被围绕的区域

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

  6. 算法题目——被围绕的区域(dfs,bfs)

    leetcode.130被围绕的区域 dfs解法: 深度优先遍历: 思路: 读取数据后 1.先将数据的四周进行bfs算法(因为只有与外围接触的点,才能不被包围) 算法执行中时,递归看看该点的上下左右有 ...

  7. leetcode130. 被围绕的区域(bfs)

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

  8. leetcode130. 被围绕的区域

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

  9. LeetCode 130. 被围绕的区域(图的BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' ...

最新文章

  1. python输入完怎么运行-教你如何编写、保存与运行Python程序的方法
  2. Matlab实用程序--图形应用-双y轴图形的绘制
  3. Crontab的格式
  4. 现代软件工程 第六章 【敏捷流程】练习与讨论
  5. 30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码
  6. thrift客户端调用不支持多线程,非线程安全
  7. 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻
  8. 因“突发肾结石” 孙宇晨宣布取消与巴菲特的午餐会面
  9. Leetcode796.Rotate String旋转字符串
  10. vc10的C2664和C2065错误
  11. 【python路上小记】匹配11位电话正则表达式
  12. 桌面提醒助手谷歌浏览器插件
  13. windows计算机锁屏的快捷键是什么,win10电脑锁屏快捷键是什么
  14. 项目实战--Ego微商小程序
  15. jersey restful 测试_Jersey实现Restful服务
  16. JAVA计算机毕业设计藏宝阁游戏交易系统Mybatis+系统+数据库+调试部署
  17. 浏览器引擎 Chromium
  18. Fibonacci Sum(二项式求和)
  19. 计算机中线性结构定义,数据结构基本概念
  20. 工作中遇到的IE6兼容性问题及解决办法

热门文章

  1. # 学习记录1(C#-解决内存泄漏的几种方法)
  2. 发音程序c语言,用C语言发声
  3. 一次阿里巴巴的电话面试
  4. php 计算函数 相加,比较,相除,相减,求余,相乘
  5. IT 行业:前端和后端分别是要做什么?哪个方向加班时间更多?
  6. 令人担忧的5G网络可被黑客入侵
  7. 如何将音乐添加到PowerPoint演示文稿
  8. 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台
  9. 高校计算机系统提升班,计算机学院举行“康继昌智能系统班”选拔宣讲会
  10. 移动端HTML5 文件预览及上传