被围绕的区域[中等]

一、题目

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

示例 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"]]

::: warning
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]XO
:::

二、代码

本题给定的矩阵中有三种元素:
1、字母X
2、被字母X包围的字母O
3、没有被字母X包围的字母O

本题要求将所有被字母X包围的字母 O都变为字母X,但很难判断哪些O是被包围的,哪些O不是被包围的。

注意到题目解释中提到:任何边界上的O都不会被填充为X。 我们可以想到,所有的不被包围的O都直接或间接与边界上的O相连。我们可以利用这个性质判断O是否在边界上,具体地说:
1、对于每一个边界上的O,我们以它为起点,标记所有与它直接或间接相连的字母O
2、最后我们遍历这个矩阵,对于每一个字母:如果该字母被标记过,则该字母为没有被字母X包围的字母O,我们将其还原为字母O;如果该字母没有被标记过,则该字母为被字母X包围的字母O,我们将其修改为字母X

【1】深度优先搜索: 我们可以使用深度优先搜索实现标记操作。在下面的代码中,我们把标记过的字母O修改为字母A

class Solution {int n, m;public void solve(char[][] board) {n = board.length;if (n == 0) {return;}m = board[0].length;for (int i = 0; i < n; i++) {dfs(board, i, 0);dfs(board, i, m - 1);}for (int i = 1; i < m - 1; i++) {dfs(board, 0, i);dfs(board, n - 1, i);}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (board[i][j] == 'A') {board[i][j] = 'O';} else if (board[i][j] == 'O') {board[i][j] = 'X';}}}}public void dfs(char[][] board, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') {return;}board[x][y] = 'A';dfs(board, x + 1, y);dfs(board, x - 1, y);dfs(board, x, y + 1);dfs(board, x, y - 1);}
}

时间复杂度: O(n×m),其中nm分别为矩阵的行数和列数。深度优先搜索过程中,每一个点至多只会被标记一次。
空间复杂度: O(n×m),其中nm分别为矩阵的行数和列数。主要为深度优先搜索的栈的开销。

【2】广度优先搜索: 我们可以使用广度优先搜索实现标记操作。在下面的代码中,我们把标记过的字母O修改为字母A

class Solution {int[] dx = {1, -1, 0, 0};int[] dy = {0, 0, 1, -1};public void solve(char[][] board) {int n = board.length;if (n == 0) {return;}int m = board[0].length;Queue<int[]> queue = new LinkedList<int[]>();for (int i = 0; i < n; i++) {if (board[i][0] == 'O') {queue.offer(new int[]{i, 0});board[i][0] = 'A';}if (board[i][m - 1] == 'O') {queue.offer(new int[]{i, m - 1});board[i][m - 1] = 'A';}}for (int i = 1; i < m - 1; i++) {if (board[0][i] == 'O') {queue.offer(new int[]{0, i});board[0][i] = 'A';}if (board[n - 1][i] == 'O') {queue.offer(new int[]{n - 1, i});board[n - 1][i] = 'A';}}while (!queue.isEmpty()) {int[] cell = queue.poll();int x = cell[0], y = cell[1];for (int i = 0; i < 4; i++) {int mx = x + dx[i], my = y + dy[i];if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') {continue;}queue.offer(new int[]{mx, my});board[mx][my] = 'A';}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (board[i][j] == 'A') {board[i][j] = 'O';} else if (board[i][j] == 'O') {board[i][j] = 'X';}}}}
}

时间复杂度: O(n×m),其中nm分别为矩阵的行数和列数。广度优先搜索过程中,每一个点至多只会被标记一次。
空间复杂度: O(n×m),其中nm分别为矩阵的行数和列数。主要为广度优先搜索的队列的开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aardio网页组件:webPageOperation

webPageOperation是webview的初步封装&#xff0c;用来网页填表、操作网页。可操作web.form、web.view、web.view2等浏览器组件。 使用方法 首先把webPageOperation.aardio&#xff08;源码在后面&#xff09;放到~\lib\godking目录下&#xff0c;然后新建窗口项目&#xff…

HarmonyOS开发入门HelloWorld及工具安装

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

mysql:在字符串类型的列上创建索引,建议指定索引前缀长度

https://dev.mysql.com/doc/refman/8.2/en/create-index.html#create-index-column-prefixes 在字符串类型的列上创建索引&#xff0c;建议指定索引前缀长度&#xff0c;而没有必要用整个列来创建索引。因为用前面的字符创建索引&#xff0c;查询时并不会比在整列上创建索引慢很…

【LeetCode刷题】-- 165.比较版本号

165.比较版本号 方法&#xff1a;使用双指针 class Solution {public int compareVersion(String version1, String version2) {//使用双指针int n version1.length(),m version2.length();int i 0,j 0;while(i<n || j <m){int x 0;for(; i < n && vers…

video 标签 各种属性及所有事件监听

网页中的video 属性和事件&#xff0c;用于计算观看视频的时长&#xff0c;其他用法备存。 <!-- video 不支持 IE8及以下版本浏览器&#xff0c;支持三种视频格式&#xff1a;MP4&#xff0c;WebM 和 Ogg --><video src"test.mp4" controls width"400…

鸿蒙OS应用开发者高级认证题库

一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09; 在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴…

wordpress301重定向传权

方法一&#xff1a;.htaccess文件 如果你有服务器访问权限&#xff0c;可以通过编辑网站根目录下的.htaccess文件来实现301重定向。 打开网站根目录下的.htaccess文件在文件末尾添加以下代码&#xff1a; <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_…

Linux访问MySQL数据库(包含实验案例)

1、访问MySQL数据库。 1.1、登录到MySQL服务器 经过安装后的初始化过程&#xff0c;MySQL数据库的默认管理员用户名为"root"&#xff0c;密码为空。 [rootyang ~]# mysql -u root //"-u"选项用于指定认证用户有密码的情况下&#xff0c;使用"-p&qu…

什么是Composer Autoloader?如何使用它?

Composer Autoloader 是 Composer 工具的一部分&#xff0c;它负责自动加载你项目中使用的类。Autoloader 的目的是避免手动包含&#xff08;include 或 require&#xff09;每个类文件&#xff0c;使得类的加载更加自动和灵活。 以下是如何使用 Composer Autoloader 的简要步…

Tcon基础知识

1、TCON&#xff0c;就是 Timing Controller 的缩写。从主芯片输出的要在 TFT 显示屏上显示的数据&#xff0c;在经过 TCON 模块后可以变换生成 Panel 可以直接利用的 DATA 信号和驱动器&#xff08;包括 source driver 和 gate driver&#xff09;的控制信号。 TV 市场上 TCO…

【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

0&#xff0c;需求 用查找表设计实现一个正弦波形发生器 寻址的位宽是10位&#xff0c;数据量是1024个&#xff0c;输出的数据是16位 1&#xff0c;需求分析 数据量是1024个&#xff1a; x linspace(0,2*pi,1024) 输出数据是16位: y范围&#xff1a;0~2^16 -1 0~65535…

[BUG记录]UART占用CPUload过高问题

目录 关键词平台说明一、背景二、根本原因三、措施 关键词 嵌入式、C语言、autosar、TDA4 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、背景 在基于TDA4开发的域控中使用到了UART打印debug信息&#xff0c;不…

Activiti七大接口,28张表详解

Activiti七大接口&#xff0c;28张表详解 7大接口 RepositoryService&#xff1a;提供管理流程部署和流程定义API。 RuntimeService&#xff1a;提供运行时流程实例进行管理与控制API。 TaskService&#xff1a;提供流程任务管理API。 IdentityService&#xff1a;提供对流程…

人生如旅途,重要的是欣赏沿途的风景,而不是匆忙地赶路

人生如旅途&#xff0c;重要的是欣赏沿途的风景&#xff0c;而不是匆忙地赶路

【内存函数】

目录 memcpy使用和模拟实现memmove使用和模拟实现memset使用memcmp使用 1. memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num) ; 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存的位置这个函数在遇到…

Diary23-全网最全的Javascript合集

1.什么是Javascript Javascript是一门世界上最流行的脚本语言 一个合格的后端人员&#xff0c;必须要精通Javascript 2.快速入门 2.1引入Javascript 2.1.1内部标签 <!--script标签内&#xff0c;写Javascript--><script>alert(hello world);</script>…

学习通【劳动通论】2023章节练习题

社会主义核心价值观24个字是&#xff1a;富强、民主、文明、和谐&#xff0c;自由、平等、公正、法治&#xff0c;爱国、敬业、诚信、友善。 1、“富强、民主、文明、和谐”&#xff0c;是我国社会主义现代化国家的建设目标&#xff0c;也是从价值目标层面对社会主义核心价值观…

探索云测试的方法:优化软件质量的新趋势

随着云计算技术的不断发展&#xff0c;云测试成为提高软件质量和效率的关键方法之一。本文将介绍一些云测试的方法&#xff0c;以帮助团队更好地应对不同的测试需求和挑战。 1. 云测试环境搭建 传统测试中&#xff0c;搭建测试环境可能需要大量的时间和资源。云测试通过提供可扩…

环境搭建及源码运行_java环境搭建_mysql安装

1、介绍 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一 1、源码中涉及到的表&#xff1a;mysql 表&#xff1a;订单、意见反馈、用户基础信息、商品、购物车等表 2、订单属于…

linux高级管理——访问MYSQL数据库

一、认识数据库系统&#xff1a; MySQL数据库系统也是一个典型的C/S(客户端/服务器&#xff09;架构的应用&#xff0c;要访问MySQL数据库需要使用专门的客户端软件。在Linux系统中&#xff0c;最简单、易用的MySQL客户端软件是其自带的mysql命令工具。 1&#xff0e;登录到My…