力扣每日一题130:被围绕的区域

题目

中等

相关标签

相关企业

给你一个 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'

通过次数 285.7K

提交次数 614.4K

通过率 46.5%

方法一:并查集

利用并查集,将相邻的相同字母视为一个连通集。边界上的'O'视为同一个集,易得,不与边界上的'O'相邻的'O'即为被围绕的区域。

下面是某位大佬的java代码

class UnionFind {int[] parents;public UnionFind(int totalNodes) {parents = new int[totalNodes];for (int i = 0; i < totalNodes; i++) {parents[i] = i;}}// 合并连通区域是通过find来操作的, 即看这两个节点是不是在一个连通区域内.void union(int node1, int node2) {int root1 = find(node1);int root2 = find(node2);if (root1 != root2) {parents[root2] = root1;}}int find(int node) {while (parents[node] != node) {// 当前节点的父节点 指向父节点的父节点.// 保证一个连通区域最终的parents只有一个.parents[node] = parents[parents[node]];node = parents[node];}return node;}boolean isConnected(int node1, int node2) {return find(node1) == find(node2);}
}
class Solution {int rows;int cols;public void solve(char[][] board) {if (board == null || board.length == 0)return;rows = board.length;cols = board[0].length;// 用一个虚拟节点, 边界上的O 的父节点都是这个虚拟节点UnionFind uf = new UnionFind(rows * cols + 1);int dummyNode = rows * cols;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (board[i][j] == 'O') {// 遇到O进行并查集操作合并if (i == 0 || i == rows - 1 || j == 0 || j == cols - 1) {// 边界上的O,把它和dummyNode 合并成一个连通区域.uf.union(node(i, j), dummyNode);} else {// 和上下左右合并成一个连通区域.if (i > 0 && board[i - 1][j] == 'O')uf.union(node(i, j), node(i - 1, j));if (i < rows - 1 && board[i + 1][j] == 'O')uf.union(node(i, j), node(i + 1, j));if (j > 0 && board[i][j - 1] == 'O')uf.union(node(i, j), node(i, j - 1));if (j < cols - 1 && board[i][j + 1] == 'O')uf.union(node(i, j), node(i, j + 1));}}}}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (uf.isConnected(node(i, j), dummyNode)) {// 和dummyNode 在一个连通区域的,那么就是O;board[i][j] = 'O';} else {board[i][j] = 'X';}}}}int node(int i, int j) {return i * cols + j;}}

方法二:深度优先搜索

前面提到,不与边界的'O'连通的'O'即为被包围的区域。所以我们可以以四条边上的'O'为起点搜索,将与边界'O'连通的'O'做个标记,随后有标记的'O'就改回'O',没有标记的'O'就变成'X'。

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

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

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

相关文章

从GPU到ASIC,博通和Marvell成赢家

ASIC市场上&#xff0c;博通预计今年AI收入将达到110亿美元以上&#xff0c;主要来自与Google和Meta的合作&#xff1b;Marvell预计2028年AI收入将达到70亿至80亿美元&#xff0c;主要来自与Amazon和Google的合作。 随着芯片设计和系统复杂性的增加&#xff0c;科技大厂将更多地…

主成分分析

主成分分析&#xff08;Principal Component Analysis&#xff0c;简称PCA&#xff09;是一种统计方法&#xff0c;它通过正交变换将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;这些不相关变量称为主成分。PCA常用于降维、数据压缩和模式识别等领域。 PCA的主要…

tcp协议中的起始序号

目录 起始序号 引入 序号和确认序号 总结 起始序号 引入 在介绍TIME_WAIT状态时,我们就提到了起始序号 -- tcp协议的超时重传(去重,确定时间),通信建立机制(三次握手,通信,四次挥手的细节和图解),为什么是3次/4次,肉机,全/半连接队列,SYN洪水,TIME_WAIT状态(解决,为什么出现…

重写setter方法要小心递归调用

错误的重写 // 假设SQIPerson有一个子类叫做SQISmithPerson, 专门表示那些姓"Smith"的人, 重写了 lastName 属性对应的设置方法 - (void)setLastName:(NSString *)lastName {if (![lastName isEqualToString:"Smish"]) {[NSException raise:NSInvalidArgu…

【系统学C++】一、从C语言到C++(一)

【系统学C】一、从C语言到C&#xff08;一&#xff09; C介绍C语言和C的联系C介绍 头文件命名空间定义命名空间使用命名空间中的名称使用using声明或指令命名空间与C语言的对比给命名空间起别名注意事项std 标准输入输出std::endl使用std::cout进行输出使用std::cin进行输入格式…

EGST:Explicit Geometric Structure Transformer论文解读

目录 一、导言 二、相关工作 1、3D局部描述子 2、点云配准方法 三、EGST模型 1、结构化特征 2、特征提取 3、点云匹配 4、变换估计 5、损失函数 四、实验 1、数据集 2、评估指标 3、细节 4、对比实验 一、导言 该论文提出一种基于增强几何结构特征的点云配准方…

flutter image_picker 执行拍照的图片怎么保存到本地

在 Flutter 中&#xff0c;使用 image_picker 插件拍照的图片默认会被保存到设备的临时目录中。这个临时目录的具体位置取决于设备的操作系统。在 iOS 上&#xff0c;它通常是应用的沙盒目录&#xff1b;在 Android 上&#xff0c;它通常是应用的缓存目录。 这些图片不会被自动…

C语言详解文件操作

目录 什么是文件&#xff1f; 为什么使用文件&#xff1f; 程序文件和数据文件、文本文件和二进制文件 1.程序文件和数据文件 1.1程序文件 1.2数据文件 2.文本文件和二进制文件 文件的打开和关闭&#xff08;流、标准流、文件指针和文件的打开与关闭&#xff09; 1.流和标…

Web前端管理系统项目:深度解析与实现之道

Web前端管理系统项目&#xff1a;深度解析与实现之道 在当今数字化时代&#xff0c;Web前端管理系统项目已成为企业信息化建设的核心组成部分。这类项目不仅涉及技术的深度和广度&#xff0c;更考验开发者的综合素质和创新能力。本文将从四个方面、五个方面、六个方面和七个方…

希尔排序(Shell_sort)

希尔排序常用于插入排序的数据预处理&#xff0c;用于提升插入排序的大数据处理速度 将插入排序的函数改为n递增即可使用希尔排序 间隔为n的插入排序&#xff1a; 将i初始值改为1&#xff0c;然后j循环所有的1改为n即可 void Insertion_sort(int *arr,int size,int n) {int…

有点好玩的python运维脚本

python运维脚本 1. 常用端口扫描2. 文件整理 1. 常用端口扫描 在计算机网络中&#xff0c;端口是一个通信端点&#xff0c;允许不同的进程或服务通过网络连接和交换数据。端口通过数值来标识&#xff0c;并与特定的协议相关联。未采取适当安全措施而保持端口开放&#xff0c;可…

InternLM Xtuner Qlora 微调

Xtuner 简介 XTuner 是由上海人工智能实验室开发的一款低成本大模型训练工具箱。它以高效、灵活和全能的特性&#xff0c;成为轻量化大模型微调的理想选择。借助 XTuner&#xff0c;用户仅需 8GB 显存即可对 InternLM2-7B 模型进行微调&#xff0c;从而定制出独一无二的 AI 助手…

C++~~期末复习题目讲解---lijiajia版本

目录 1.类和对象 &#xff08;3&#xff09;创建对象的个数 &#xff08;3&#xff09;全局变量&#xff0c;局部变量 &#xff08;4&#xff09;构造函数的执行次数 &#xff08;5&#xff09;静态动态析构和构造顺序 &#xff08;6&#xff09;初始化顺序和声明顺序 &a…

安装systemd-bootchart

要安装systemd-bootchart&#xff0c;你可以按照以下步骤进行&#xff1a; 步骤一&#xff1a;更新软件包列表 首先&#xff0c;打开终端并更新你的软件包列表&#xff0c;以确保你拥有最新的可用软件包信息。运行以下命令&#xff1a; sudo apt update步骤二&#xff1a;安…

Git使用总结(git使用,git实操,git命令和常用指令)

简介&#xff1a;Git是一款代码版本管理工具&#xff0c;可以记录每次提交的代码&#xff0c;防止代码丢失&#xff0c;可实现版本迭代&#xff0c;解决代码冲突&#xff0c;常用的远程Git仓库&#xff1a;Gitee&#xff08;国内&#xff09;、GitHub&#xff08;国外&#xff…

接口请求的六种常见方式详解(get、post、head等)

一&#xff0e;接口请求的六种常见方式&#xff1a; 1、Get 向特定资源发出请求&#xff08;请求指定页面信息&#xff0c;并返回实体主体&#xff09; 2、Post 向指定资源提交数据进行处理请求&#xff08;提交表单、上传文件&#xff09;&#xff0c;又可能导致新的资源的建…

封装console

目的 1. 封装console.log , 使得打印更美观方便 2. 同时希望上线后不在打印消耗资源 例图&#xff1a; export const prettyLog () > {const isProduction import.meta.REACT_APP_ENV "prod";const isEmpty (value) > {return value null || val…

【C++关键字】指针空值nullptr(C++11)

指针空值nullptr&#xff08;C11&#xff09; C98中的指针空值C11中的指针空值 C98中的指针空值 在学习C语言阶段&#xff0c;由良好的C\C编程习惯&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则会出现未初始化的指针&#xff0c;野指针等情况。 in…

Flutter 实现dispose探测控件

文章目录 前言一、什么是dispose探测控件&#xff1f;1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言 开发flutter一般…

Java 期末复习 习题集

&#x1f496; 单选题 &#x1f496; 填空题 &#x1f496; 判断题 &#x1f496; 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …