【LeetCode】被围绕的区域 [M](深度优先遍历)

news2024/9/27 21:28:50

130. 被围绕的区域 - 力扣(LeetCode)

一、题目

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

二、代码

class Solution {
    public void solve(char[][] board) {
        // 将连到上下两个边界的连成一片的O都感染成F
        for (int j = 0; j < board[0].length; j++) {
            if (board[0][j] == 'O') {
                infect(board, 0, j);
            }

            if (board[board.length - 1][j] == 'O') {
                infect(board, board.length - 1, j);
            }
        }

        // 将连到左右两个边界的连成一片的O都感染成F
        for (int i = 0; i < board.length; i++) {
            if (board[i][0] == 'O') {
                infect(board, i, 0);
            }

            if (board[i][board[0].length - 1] == 'O') {
                infect(board, i, board[0].length - 1);
            }
        }

        // 执行到这里,所有连接到边界的连成一片的O都改成了F,此时矩阵中仍然为O的,一定都是被X包围的

        // 遍历矩阵,将此时矩阵中为O的改成X,为F的再改回O,完成题目要求
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                } else if (board[i][j] == 'F') {
                    board[i][j] = 'O';
                }
            }
        }
    }

    // 通过递归来进行感染过程,从(i,j)开始将连城一片的O改成F
    public void infect(char[][] board, int i, int j) {
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != 'O') {
            return;
        }

        board[i][j] = 'F';
        infect(board, i + 1, j);
        infect(board, i - 1, j);
        infect(board, i, j + 1);
        infect(board, i, j - 1);
    }
}

三、解题思路 

先开始绕着整个矩阵四周的边界开始感染,将从边界开始延伸连成一片的O都感染成F。

完成感染之后,此时只要是会连接到边界的那一片O都已经被感染成了F,还没有被感染成F的O一定都在矩阵内部,不和矩阵边界相连。所以再次遍历矩阵,遍历到的O一定都是没有从四周感染到的O,它一定是被X包裹的,将这些被X包裹的O在遍历过程中都改成X。最后再将矩阵中的F再改回O,就完成了将所有被 X 围绕的区域里所有的O用X填充。

for循环,在第0行边界和N-1行边界为O的位置开始往下、往上感染,将连成一片的O都改成F。
for循环,在左边界和右边界为O的位置开始往内感染,将连成一片的O都改成F。

此时与边界连通的练成一片的O就都改成F了,此时在矩阵中仍然为O的位置,就是完全被X包裹的O。最后遍历一遍矩阵,将此时矩阵中的O改成X,F改为O即可。

时间复杂度O(N*M)

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

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

相关文章

浅谈Flink批模式Adaptive Hash Join

Flink批Hash Join递归超限问题 随着Flink流批一体能力的迅速发展以及Flink SQL易用性的提升&#xff0c;越来越多的厂商开始将Flink作为离线批处理引擎使用。在我们使用Flink进行大规模join操作时&#xff0c;也许会发生如下的异常&#xff0c;导致任务失败&#xff1a; Hash j…

Es进阶检索

本文用到的测试数据及所有代码链接&#xff1a; https://blog.csdn.net/m0_62436868/article/details/128505566?spm1001.2014.3001.5501 1、SearchAPI ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数&#xff08;uri检索参数&#xff09; 另…

基于华为eNSP的中小企业办公园区网络规划与设计

目录一、需求分析&#xff08;一&#xff09;项目背景&#xff08;二&#xff09;网络业务需求&#xff08;三&#xff09;网络应用需求二、网络结构设计三、网络拓扑图四、网络设备基本配置五、项目测试结语运用到的技术有&#xff1a; 1、虚拟局域网&#xff08;VLAN&#xf…

人工智能--你需要知道的一切

人工智能--你需要知道的一切 人工智能是当今最受关注的技术之一。但它究竟是什么&#xff1f;你为什么要关心&#xff1f; 人工智能是当今最受关注的技术之一。但它到底是什么&#xff1f;你为什么要关心&#xff1f;在这里&#xff0c;我们将介绍你需要知道的关于人工智能的…

java开发的美妆化妆品电商商城系统

简介 Java基于ssm(可以转springboot项目哦)开发的美妆商城系统&#xff0c;主要是卖化妆品的系统&#xff0c;用户可以浏览商品&#xff0c;加入购物车&#xff0c;下单&#xff0c;在个人中心管理自己的订单。管理员可以管理自己的商品&#xff0c;发布商品&#xff0c;上下架…

2023年留学基金委(CSC)公派访问学者博士后项目选派办法及解读

2023年即将伊始。知识人网祝大家新年快乐&#xff0c;心想事成&#xff01;同时提醒申请者关注国家留学基金委&#xff08;CSC&#xff09;的申报政策。目前CSC官网已经发布了2023年公派访问学者、博士后的项目通知&#xff0c;知识人网小编现将其选派工作流程及选派办法原文转…

C语言 自定义类型

结构体内存对齐 解释1 从内存开始位置存放 解释二 int对齐数是4 vs默认对齐数是8 取其较小值的倍数 那就是4的位置存放 char 对数1 vs是8默认 谁的较小值对数是1 那就是任意数 所以c2防砸8 如下图绿色部分 struct S2 {char c1;int i;double d;//8 };输出结果16 struct S4 …

当我们身边没有示波器就无法测量频率与占空比了?一招教你解决身边没有示波器时如何测量STM32定时器产生PWM的频率与占空比

当我们身边没有示波器就无法测量频率与占空比了&#xff1f;这篇文件小编就教大家如何使用定时器输入捕获功能测量频率与占空比。 原理解析 定时器输入捕获一般应用在两个方面&#xff0c;一个方面是脉冲跳变沿时间测量&#xff0c;另一方面是 PWM输入测量。下面将要使用就是测…

LaTeX快速入门

文章目录LaTeX快速入门一、 概述1、 简介2、 环境配置3、文件结构4、 文档结构二、 基本概念1、 第一个LaTeX程序2、 宏包和文档类2.1 宏包2.2 文档类3、 文件组织的方式4、 相关术语和概念三、 排版文字1、 文字编码2、 排版中文3、 LaTeX中的字符3.1 空格和分行3.2 注释3.3 特…

Redis(Ⅰ)【学习笔记】

&#xff08;仅作为个人学习笔记&#xff09; 1.什么是Redis&#xff1f; 1.Redis 是用C语言开发的一个开源的高性能键值对&#xff08; key-value &#xff09;内存数据库&#xff0c;它是一种 NoSQL 数据库。 2.它是【单进程单线程】的内存数据库&#xff0c;所以说不存在线…

charAt()方法的使用

charAt()函数 Java charAt() 方法属于Java String类 charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。 语法 public char charAt(int index) 参数 index – 字符的索引。 返回值 返回指定索引处的字符。 举个例子&#xff1a; package 做题;…

基于思维进化算法优化BP神经网络(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

Kubernetes之PV与PVC

1. 综述 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就可以将注…

linux系统中利用设备树完成对LED的控制

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中的设备树控制led。 目录 第一&#xff1a;设备树LED基本驱动原理 第二&#xff1a;LED灯驱动程序的实现 第一&#xff1a;设备树LED基本驱动原理 本次实验采用设备树向linux内核传递相关的寄存器物理…

MATLAB演示梯度上升寻找极值

MATLAB演示梯度上升寻找极值 梯度 梯度的本意是一个向量&#xff08;矢量&#xff09;&#xff0c;表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处沿着该方向&#xff08;此梯度的方向&#xff09;变化最快&#xff0c;变化率最大&#xff08…

dubbo源码解析-SPI机制

SPI&#xff0c;Service Provider Interface&#xff0c;服务提供者接口&#xff0c;是一种服务发现机制。 JDK 的 SPI 规范 JDK 的 SPI 规范规定&#xff1a;  接口名&#xff1a;可随意定义  实现类名&#xff1a;可随意定义  提供者配置文件路径&#xff1a;其查…

剑指offer(简单)

目录 数组中重复的数字 替换空格 从尾到头打印链表 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 二进制中的1的个数 打印从1到最大的n位数 删除链表的节点 调整数组顺序使奇数位于偶数前面 链表中倒数第k个节点 反转链表 合并两个排序的链…

一文读懂tensorflow: 基本概念和API

文章目录前言tensorflow发展历程基本概念张量神经网络、层模型超参数损失函数交叉熵函数激活函数梯度和自动微分优化器tensorflow 2.x 和 tensorflow 1.xtensorflow开发流程tensorflow API张量的定义和运算示例张量的初始化方式梯度计算模型的搭建示例&#xff1a;MINST手写数字…

Casting out Primes: Bignum Arithmetic for Zero-Knowledge Proofs学习笔记

1. 引言 Polygon zero团队 Daniel Lubarov 和 Polygon zkEVM团队 Jordi Baylina 2022年10月联合发表的论文 《Casting out Primes: Bignum Arithmetic for Zero-Knowledge Proofs》。 受“casting out nines” 技术——做对9取模运算并提供概率性结果&#xff0c;启发&#x…

RocketMQ 的存储模型

文章目录1.整体概览2.数据文件3.消费文件4.索引文件1.整体概览 Producer &#xff1a;消息发布的角色&#xff0c;Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递&#xff0c;投递的过程支持快速失败并且低延迟。 Consumer &#xff1a;消息消费的角…