力扣每日一题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的主要…

EGST:Explicit Geometric Structure Transformer论文解读

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

C语言详解文件操作

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

有点好玩的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…

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;} …

Chapter 6 Frequency Response of Amplifiers

Chapter 6 Frequency Response of Amplifiers 这一节我们学习单极和差分运放的频率响应. 6.1 General Considerations 我们关心magnitude vs 频率, 因此有低通, 带通, 高通滤波器 6.1.1 Miller Effect Miller’s Theorem 考虑impedance Z1和Z2, X和Y之间增益为Av. Z1 Z/(…

spring 启动顺序

BeanFactoryAware 可在Bean 中获取 BeanFactory 实例 ApplicationContextAware 可在Bean 中获取 ApplicationContext 实例 BeanNameAware 可以在Bean中得到它在IOC容器中的Bean的实例的名字。 ApplicationListener 可监听 ContextRefreshedEvent等。 CommandLineRunner 整…

数据结构与算法笔记:基础篇 - 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

概述 上篇文章&#xff0c;我们学习了树、二叉树及二叉树的遍历&#xff0c;本章来学习一种特殊的二叉树&#xff0c;二叉查找树。二叉查找树最大的特点就是&#xff0c;支持动态数据集合的快速插入、删除、查找操作。 之前说过&#xff0c;散列表也是支持这些操作的&#xf…

盘点2024年5月Sui生态发展,了解Sui近期成长历程!

2024年5月是Sui的第一个生日月&#xff0c;Sui迎来了它的上线一周年纪念日。在过去的一年中Sui在技术进步与创新、生态系统的扩展、社区发展与合作伙伴关系以及重大项目和应用推出方面取得重要进展&#xff0c;展示了其作为下一代区块链平台的潜力。 以下是Sui的近期成长历程集…

QT 信号和槽 通过自定义信号和槽沟通 如何自定义槽和信号的业务,让它们自动关联 自定义信号功能

通过信号和槽机制通信&#xff0c;通信的源头和接收端之间是松耦合的&#xff1a; 源头只需要顾自己发信号就行&#xff0c;不用管谁会接收信号&#xff1b;接收端只需要关联自己感兴趣的信号&#xff0c;其他的信号都不管&#xff1b;只要源头发了信号&#xff0c;关联该信号…

STM32 | 独立看门狗 | RTC(实时时钟)

01、独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状…

QQ号码采集器-QQ邮箱采集器

寅甲QQ邮箱采集器或QQ号码采集软件, 一款采集QQ号、QQ邮件地址&#xff0c;采集QQ群成员、QQ好友的软件。可以按关键词采集&#xff0c;如可以按地区、年龄、血型、生日、职业等采集。采集速度非常快且操作很简单。