[路飞]_leetcode-130-被围绕的区域

简介: leetcode-130-被围绕的区域

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


给你一个 m x n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。


示例 1:


网络异常,图片无法展示
|


输入: board = [["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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
复制代码


示例 2:


输入: board = [["X"]]
输出: [["X"]]
复制代码


提示:


  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j]'X''O'


解题思路


本题要求我们将被环绕的 O 改为 X


最直接的方式是获取被环绕的 O,将它们改为 X,但是判断哪些 O 被环绕其实是有些麻烦的,所以我们可以换一种思路。


我们去找没有被环绕的 O,则剩余的就是被环绕的 O。判断哪些 O 没有被环绕相对简单很多,因为没有被环绕的 O 中必须保证有一个区域是在边上的,所以我们只需要扫描矩阵的四条边,如果有 O,则其没有被环绕,而与之相连的 O 也没有被环绕,给这些区域做上标记,接下来扫描整个矩阵,将没有做标记的 O 改为 X即可。


代码实现


var solve = function(board) {
  // 获取矩阵的纵向长度和横向长度
  const m = board.length,n = board[0].length;
  // 将没有被环绕的 O 打上标记
  function tag(i,j){
    // 如果当前坐标不合法或者当前区域不是 O,直接返回
    if(i<0 || i>=m || j<0 || j>=n || board[i][j]!=='O') return;
    // 将当前区域打上标记
    board[i][j] = 'A'
    // 处理与之相连的区域
    tag(i-1,j)
    tag(i+1,j)
    tag(i,j-1)
    tag(i,j+1)
  }
  // 上
  for(let j = 0;j<n;j++) tag(0,j)
  // 下
  for(let j = 0;j<n;j++) tag(m-1,j)
  // 左
  for(let i = 0;i<m;i++) tag(i,0)
  // 右
  for(let i = 0;i<m;i++) tag(i,n-1)
  // 扫描矩阵,将没有标记的 O 改为 X,被标记的 O 保持为 O
  for(let i = 0;i<m;i++){
    for(let j = 0;j<n;j++){
      if(board[i][j]==='O') board[i][j] = 'X'
      if(board[i][j]==='A') board[i][j] = 'O'
    }
  }
};
复制代码


至此我们就完成了 leetcode-130-被围绕的区域


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
Java 数据库
JAVA并发编程-一文看懂全部锁机制
曾几何时,面试官问:java都有哪些锁?小白,一脸无辜:用过的有synchronized,其他不清楚。面试官:回去等通知! 今天我们庖丁解牛说说,各种锁有什么区别、什么场景可以用,通俗直白的分析,让小白再也不怕面试官八股文拷打。
|
存储 搜索推荐 数据建模
阿里巴巴大数据实践之数据建模:构建企业级数据湖
阿里巴巴通过构建高效的数据湖和实施先进的数据建模策略,实现了数据驱动的业务增长。这些实践不仅提升了内部运营效率,也为客户提供了更好的服务体验。随着数据量的不断增长和技术的不断创新,阿里巴巴将持续优化其数据建模方法,以适应未来的变化和发展。
|
Shell Linux 网络安全
git生成SSH秘钥
git生成SSH秘钥
886 2
|
Java
Java 面向对象编程大揭秘:子类如何“继承”父类,摇身一变成为“新贵”?!
【6月更文挑战第16天】Java中的继承允许子类从父类继承特性与功能,如`Dog`继承`Animal`,重写`makeSound`方法,展现独特行为。同样,`Circle`继承`Shape`,定制`draw`方法以绘制圆形。继承提高了代码复用和灵活性,使子类能基于父类基础创新,如同接力赛中父类传递接力棒,子类创造新辉煌。在Java世界,继承是构建复杂项目的关键机制,有待深入探索。
147 4
|
调度 芯片 Windows
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.5 无源波分复用器件
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.5 无源波分复用器件
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.5 无源波分复用器件
|
算法 计算机视觉
图像匹配系统 图像检索系统
图像匹配系统 图像检索系统
147 0
|
前端开发 Java 关系型数据库
你们要的测试练习网站来了
搭建测试环境首选的有tpshop、shopxo、iwebshop这类php开发的电商网站,虽然部署方便,但是却跟企业实际的架构相差太远,不利于我们更好的了解和学习软件测试。
你们要的测试练习网站来了
|
Java Nacos Spring
项目采坑日志—XxlJob配置迁移到Nacos,项目运行提示Could not resolve placeholder ‘xxl.job.accessToken’ in value
项目采坑日志—XxlJob配置迁移到Nacos,项目运行提示Could not resolve placeholder ‘xxl.job.accessToken’ in value
1272 0
|
C语言 C++
【c++/c】C语言“小小计算器”扩展功能,文件的读取和写入【期末大作业】
学生成绩排序” 定义学生结构体数组,长度为10,依次输入这十个学生的学号、姓名、成绩,利用冒泡排序,对这10个学生排序,从小到大输出这10个学生的信息,然后输出10个学生的总成绩和平时成绩
352 1
【c++/c】C语言“小小计算器”扩展功能,文件的读取和写入【期末大作业】
|
存储 NoSQL Linux
redis异常 Commands that may modify the data set are disabled, because this instance is
MISCONF Redis配置为保存RDB快照,但目前无法在磁盘上持久化。可能修改数据集的命令被禁用,因为该实例被配置为在RDB快照失败时报告错误(stop-write -on-bgsave-error选项)。请检查Redis的日志RDB错误的详细信息.
redis异常 Commands that may modify the data set are disabled, because this instance is