Leetcode.130 被围绕的区域

题目链接

Leetcode.130 被围绕的区域 mid

题目描述

给你一个 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 = = b o a r d . l e n g t h m == board.length m==board.length
  • n = = b o a r d [ i ] . l e n g t h n == board[i].length n==board[i].length
  • 1 < = m , n < = 200 1 <= m, n <= 200 1<=m,n<=200
  • board[i][j]'X''O'

解法:dfs

我们先从 b o a r d board board 的四周,与边界相邻的 b o a r d [ i ] [ j ] = board[i][j] = board[i][j]= ’O'的区域记录下来,这些区域是不能被 'X'填充的。

接着,剩下的 b o a r d [ i ] [ j ] = board[i][j] = board[i][j]= ’O'的区域才是能被 'X'填充的。

时间复杂度: O ( m n ) O(mn) O(mn)

C++代码:


class Solution {
public:
    void solve(vector<vector<char>>& g) {
        int m = g.size() , n = g[0].size();
        //记录是否被访问过
        bool vis[m][n];
        memset(vis,false,sizeof vis);

        function<void(int ,int,bool)> dfs = [&](int i,int j,bool mode) -> void{
            if(i < 0 || i >= m || j < 0 || j >= n || vis[i][j]) return;
            if(g[i][j] == 'X') return;
            
            vis[i][j] = true;
            if(mode) g[i][j] = 'X';

            dfs(i + 1,j,mode);
            dfs(i - 1,j,mode);
            dfs(i,j + 1,mode);
            dfs(i,j - 1,mode);
        };
        //记录从左右两边开始的 不能被 'X' 填充的位置
        for(int i = 0;i < m;i++){
            if(g[i][0] == 'O' && !vis[i][0]) dfs(i,0,false);
            if(g[i][n-1] == 'O' && !vis[i][n-1]) dfs(i,n-1,false);
        }
        //记录从上下两边开始的 不能被 'X' 填充的位置
        for(int j = 0;j < n;j++){
            if(g[0][j] == 'O' && !vis[0][j]) dfs(0,j,false);
            if(g[m-1][j] == 'O' && !vis[m-1][j]) dfs(m-1,j,false);
        }
        //剩下的 g[i][j] == 'O' 并且没有被访问过的位置 都可以被 'X'填充
        for(int i = 1;i < m - 1;i++){
            for(int j = 1;j < n - 1;j++){
                if(g[i][j] == 'O' && !vis[i][j]) dfs(i,j,true);
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

继承(C++)

继承继承的概念及定义继承的概念继承的定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承虚拟继承的原理继承的概念及定义 继承的概念 继承是面…

Spring-aop面向切面

1、理解必要的专业术语 先看看上面图&#xff0c;这是我的个人理解。(画的丑&#xff0c;主打真实) 1&#xff09;Advice&#xff0c;通知/增强&#xff1a;类方法中提出来的共性功能(大白话就是提出来的重复代码) 2&#xff09;Pointcut&#xff0c;切入点/切点&#…

Tomcat使用https配置实战

一、tomcat证书配置 首先&#xff0c;要实现https&#xff0c;就必须先具有tomcat证书。我们在安装tomcat的时候&#xff0c;肯定都先安装了JAVA&#xff0c;而JAVA中有自带的证书生成工具keytool&#xff0c;今天&#xff0c;我们就使用keytool来生成tomcat的证书。 执行命令…

chatGPT中国入口-ChatGPT评论文章-ChatGPT怎么用

国内怎么玩chatGPT 如果您在国内使用ChatGPT&#xff0c;主要的问题可能是连接OpenAI服务器的速度和稳定性。由于OpenAI位于美国&#xff0c;可能受到中国的网络限制和防火墙的影响&#xff0c;造成访问速度比较慢或不稳定。为了解决这个问题&#xff0c;您可以采取以下方法&a…

多线程冲突处理方法,锁

线程之间是可以共享进程的资源&#xff0c;比如代码段、堆空间、数据段、打开的文件等资源&#xff0c;但每个线程都有自己独立的栈空间。 那么问题就来了&#xff0c;多个线程如果竞争共享资源&#xff0c;如果不采取有效的措施&#xff0c;则会造成共享数据的混乱。 我们做…

首届“兴智杯”产业赛收官,文心大模型助推产业创新

由工业和信息化部、科学技术部、深圳市人民政府共同主办&#xff0c;中国信通院等单位承办的首届“兴智杯”全国人工智能创新应用大赛圆满收官。本次大赛受到国家部委、政府机构、科技企业、高校师生等社会各界密切关注。为了进一步激发创新活力&#xff0c;促进人工智能核心技…

量化注意事项和模型设计思想

量化的注意事项 1、量化检测器时&#xff0c;尽量不要对Detect Head进行量化&#xff0c;一旦进行量化可能会引起比较大的量化误差&#xff1b; 2、量化模型时&#xff0c;模型的First&Second Layer也尽可能不进行量化&#xff08;精度损失具有随机性&#xff09;&#xf…

rsync远程同步实现快速、安全、高效的异地备份

目录 一.rsync介绍 1.rsync是什么&#xff1f; 2.rsync同步方式 3.rsync的特性 4.rsync的应用场景 5.rsync与cp、scp对比 6.rsync同步源 二.rsync命令 1.常用选项 2.实例&#xff1a;本地复制对比 3.配置源的两种表示方法 三.实验&#xff1a;配置rsync下行同步 四…

Spring 之循环依赖

Spring 框架是一个流行的Java应用程序框架&#xff0c;它提供了许多强大的功能&#xff0c;如依赖注入和面向切面编程。然而在使用 Spring 框架时&#xff0c;我们可能会遇到循环依赖的问题。 这种情况发生在两个或多个 Bean 之间相互依赖的情况下&#xff0c;其中一个 Bean 依…

【计算机网络-网络层】路由选择协议

文章目录1 路由器与路由选择1.1 路由器1.2 路由表&#xff08;RIB 表&#xff09;1.2.1 路由表项1.2.2 动态路由1.2.3 静态路由1.2.4 直连路由1.3 转发表&#xff08;FIB 表&#xff09;1.4 自治系统 AS2 内部网关协议 IGP——路由信息协议 RIP2.1 RIP 规定2.2 RIP 的工作原理2…

Redission分布式锁

实现过程&#xff1a; 只要线程一加锁成功&#xff0c;就会启动一个 watch dog 看门狗&#xff0c;它一个后台线程&#xff0c; 会每隔 10 秒检查一下&#xff0c;如果线程 1 还持有锁&#xff0c;那么就会不断延长锁 key 生存时间。因此&#xff0c;Redisson 解决了锁过期释放…

ChatGPT常用prompts汇总

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

springboot感受优化06

01.健康检查 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>如何查看项目的健康程度 http://localhost/actuator/health 假如希望查看更多actuator选项…

基于SpringBoot+Vue的家政平台

基于SpringBootVue的家政平台 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…

命名空间和程序集

目录 一、什么是命名空间 1. 命名空间的作用 2. 命名空间跨文件伸展 3.嵌套命名空间 二、using指令 1. using命名空间指令 2. using别名指令 三、程序集的结构 1. 程序集标识符 2.强命名程序集 一、什么是命名空间 1. 命名空间的作用 命名空间是共享命名空间名的一组…

160. 相交链表 ——【Leetcode每日一题】

160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c…

CSS基础知识,必须掌握!!!

CSS基础知识Background&#xff08;背景&#xff09;CSS文本格式文本颜色文本对齐格式文本修饰文本缩进CSS中的字体字体样式字体大小CSS链接&#xff08;link&#xff09;CSS列表不同列表标项CSS列表项用图片作为标记CSS列表标记项位置CSS中表格&#xff08;table&#xff09;表…

Android:启动流程

Android启动流程 第一步&#xff1a;启动电源以及系统启动 当电源按下&#xff0c;引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM&#xff0c;然后 执行 第二步&#xff1a;引导程序 引导程序是在Android操作系统开始运行前的一个小程序。引导程序…

城乡供水一体化管控平台-农村供水监管平台-乡村振兴

建设方案 城乡供水一体化管控系统是运用云计算、大数据等信息化手段&#xff0c;借助在线监测设备&#xff0c;并依托“供水信息化平台”&#xff0c;实时感知供水系统的运行状态&#xff0c;实现对农村供水工程远程监控、在线监测、实时预警、智慧监管。 系统功能 水源地监测&…

聚类问题的算法总结

目录 一、K-means算法 1、算法原理 2、如何确定K值 3、算法优缺点 二、DBScan聚类 1、算法原理 2、处理步骤 3、算法优缺点 聚类代码实现 聚类算法属于无监督学习&#xff0c;与分类算法这种有监督学习不同的是&#xff0c;聚类算法事先并不需要知道数据的类别标签&am…
最新文章