被围绕的区域

news2024/11/24 15:20:16

题目链接

leetcode——在线链接

题目描述

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

题目示例

在这里插入图片描述
输入: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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

输入:board = [[“X”]]
输出:[[“X”]]

题目提示

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 ‘X’ 或 ‘O’

解题思路

使用深度优先搜索

这道题就像围棋一样,如果四面八方都被X包围了,那么这些O就都要变成X,而只有通到外面的O才不会变成X

因此,我们只需要确定最外面一排的O的位置,并且将所有与之相连的O都标记出来,最后将所有未标记的O都变成X即可

定义一个isUsed数组,记录当前位置是否被遍历过
定义一个DFS方法,其参数分别为:board,行数,列数,当前所在行,当前所在列,isUsed数组

在DFS方法中,先将这个位置的O标记成A,然后分别遍历其上下左右四个位置,如果未越界并且是O,那么继续往下递归

最终,不能连接到外界的O还是O,将这些O变成X,而所有能够连接到外部的O刚刚被我们变成A,现在再遍历数组将这些A变回O即可

代码

public class Solution {
    int[][] nextPosition = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    public void DFS(char[][] board, int row, int col, int curX, int curY, boolean[][] isUsed){
        //标记当前位置为联通的
        board[curX][curY] = 'A';
        isUsed[curX][curY] = true;

        //遍历下一个位置
        for (int i = 0; i < 4; i++) {
            int newX = curX + nextPosition[i][0];
            int newY = curY + nextPosition[i][1];
            //判断是否越界
            if(newX >= row || newX < 0 || newY >= col || newY < 0){
                continue;
            }
            if(board[newX][newY] == 'O'){
                DFS(board, row, col, newX, newY, isUsed);
            }
        }
    }
    public void solve(char[][] board) {
        if(board == null){
            return;
        }
        int row = board.length;
        int col = board[0].length;
        boolean[][] isUsed = new boolean[row][col];

        for (int i = 0; i < col; i++) {
            if(board[0][i] == 'O'){
                DFS(board, row, col, 0, i, isUsed);
            }
            if(board[row - 1][i] == 'O'){
                DFS(board, row, col, row - 1, i, isUsed);
            }
        }

        for (int i = 0; i < row; i++) {
            if(board[i][0] == 'O'){
                DFS(board, row, col, i, 0, isUsed);
            }
            if(board[i][col - 1] == 'O'){
                DFS(board, row, col, i, col - 1, isUsed);
            }
        }

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                //被包围
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }
                //没被包围
                if(board[i][j] == 'A'){
                    board[i][j] = 'O';
                }
            }
        }
    }
}

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

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

相关文章

德标1.4571合金元素钛的影响

1.45711.4571介绍&#xff1a;1.4571在316的基础上加入了钛&#xff0c;为解决316晶间腐蚀发展起来的钢种&#xff0c;有良好的耐晶间腐蚀性能&#xff0c;在稀H2SO4、H3PO4及有机酸和海洋大气中耐蚀性能有所提高。其它性能和316相近。◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆…

【项目实战】为什么我选择使用CloseableHttpClient,而不是HttpClient,他们俩有什么区别?

一、HttpClient介绍 HttpClient是Commons HttpClient的老版本&#xff0c;已被抛弃&#xff0c;不推荐使用&#xff1b; HttpClient是一个接口&#xff0c;定义了客户端HTTP协议的操作方法。 它可以用于发送HTTP请求和接收HTTP响应。 HttpClient接口提供了很多方法来定制请求…

RK3288-android8-IR-选不中小窗口

IR红外功能,多么基础的功能,但是说来也不简单 因为,小小的红外看似基础,实则设计太多东西了, 从关机涉及Uboot;到内核kernel键码上报;到android键码的实现,小小的功能涉及大大的范围; (101条消息) rk3288-android8-IR-mouse_旋风旋风的博客-CSDN博客 大家可以看一下我之前的…

考研复试——数据结构

文章目录数据结构什么是数据结构&#xff1f;逻辑结构和物理结构有什么区别&#xff1f;为什么对单链表设置头结点&#xff1f;算法的特点&#xff1f;常见的数据结构有哪些&#xff1f;栈在后缀表达式求值的算法思想&#xff1a;队列溢出现象&#xff1f;解决方法&#xff1f;…

【项目精选】基于Java的超级玛丽游戏的设计与实现(源码+论文+视频)

点击下载源码 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马里奥的可移动性和马里奥的生命值。当马里奥通过最后一个场景后游戏结束…

项目经理如何管理好自己的时间

由于项目各种不定因素的存在&#xff0c;有时侯我们看到有些项目经理虽然成天忙得焦头烂额&#xff0c;但绩效甚微也就不足为怪了&#xff0c;如何能让宝贵的时间花在“刀刃”上&#xff0c;抓住了问题的要害&#xff0c;才能使工作事半功倍。 1、做好工作计划 项目经理比较擅…

目前已经有80多万个数据库迁移到了亚马逊云科技上

Gartner是全球最具权威的IT研究公司&#xff0c;在IT研究领域可以说是无人不知、无人不晓。它每年都会发布各种IT产业评测报告&#xff0c;分析未来技术发展&#xff0c;帮助客户进行市场分析、技术选择、投资决策。最近看到Gartner发布的云数据库魔力象限报告&#xff0c;这也…

安装包UI美化之路-nsNiuniuSkin安装包模板介绍

今天这篇文章&#xff0c;咱们不做功能讲解了&#xff0c;来介绍一下nsNiuniuSkin的几套安装包模板的UI效果和设计理念&#xff01; 前言 经常有朋友会问&#xff0c;nsNiuniuSkin的几套模板都有些什么区别呀&#xff0c;我拿到模板后&#xff0c;如果要换成我们自己的UI方便…

Java on VS Code 2月更新|JUnit 5 并行测试与 Spring Boot 插件的过滤功能

作者&#xff1a;Nick Zhu - Senior Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到我们的二月更新&#xff01;在此博客中&#xff0c;我们将为您带来与 JUnit 5 并行测试相关的新功能以及用于 Spring Boot Dashboa…

【java基础】万字说明,一篇文章彻底搞懂java中的lambda表达式

文章目录lambda表达式是什么lambda表达式的语法函数式接口初次使用深入理解方法引用 :: 用法快速入门不同形式的::情况1 object::instanceMethod情况2 Class::instanceMethod情况3 Class::staticMethod对于 :: 的一些示例及其注意事项构造器引用变量作用域使用外部变量定义内部…

华为机试题:HJ96 表示数字(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

软件成分安全分析(SCA)能力的建设与演进

**前言 ** 随着 DevSecOps 概念的逐渐推广和云原生安全概念的快速普及&#xff0c;研发安全和操作环境安全现在已经变成了近两年行业非常热的词汇。在研发安全和应急响应的日常工作中&#xff0c;每天都会收到大量的安全风险信息&#xff0c;由于目前在系统研发的过程中&#…

【反序列化漏洞-02】PHP反序列化漏洞实验详解

为什么要序列化百度百科上关于序列化的定义是&#xff0c;将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis&#xff0c;与数组类似)。以后&#xff0c;可以通过…

2023新版PMP考试有哪些变化?

对于2022年很多事情也都在发生&#xff0c;疫情也都没有完全结束&#xff0c;基金会已经开始通知下一场考试了&#xff0c;很多人也会担心新的考纲会不会给自己带来难度&#xff0c;其实这次六月份的考试很多人都内心已经知道了结果&#xff0c;所以这里也详细说一下新考纲的改…

大数据之Apache Doris_亚秒级响应_大数据处理分析_介绍_概述---大数据之Apache Doris工作笔记0001

可以看到这个Doris的介绍 MPP是大规模并行处理 这里的clickhouse ,greenplumn也是mpp,大规模并行处理数据库 应用场景 然后我们看一下doris的架构,可以看到,这里,左侧是数据来源,可以看到这个数据来源有 OLTP数据库,比如mysql,oracle等等这种数据库,还有就是enterprise appli…

Supporting Clustering with Contrastive Learning笔记

这篇文章使用了对比学习进行了聚类&#xff0c;一种端到端的离线聚类模型。 主要流程 Feature model 比较主流的句向量编码器SBERT。本文主要使用两个损失函数去微调SBERT的参数。使得SBERT的生成的特征表示具有以下两个特点&#xff1a; 簇间距离拉大&#xff08;inter-cl…

并发编程(2)—Java 对象内存布局及 synchornized 偏向锁、轻量级锁、重量级锁介绍

一、Java 对象内存布局 1、对象内存布局 一个对象在 Java 底层布局&#xff08;右半部分是数组连续的地址空间&#xff09;&#xff0c;如下图示&#xff1a; 总共有三部分总成&#xff1a; 1. 对象头&#xff1a;储对象的元数据&#xff0c;如哈希码、GC 分代年龄、锁状态…

Android中的OpenGL

前面有关 Android 音视频的渲染都是使用MediaCodec进行渲染&#xff0c;MediaCodec也有自己的弊端比如无法进行视频的编辑处理&#xff0c;而视频可以 OpenGL ES来进行渲染&#xff0c;可以很好进行处理&#xff0c;比如添加滤镜等&#xff0c;这里介绍下 Android 中 OpenGL&am…

GrowingIO是什么?如何将GrowingIO数据导入其他系统

GrowingIO是什么&#xff1f;GrowingIO 是一站式数据增长引擎整体方案服务商&#xff0c;以数据智能分析为核心&#xff0c;通过构建客户数据平台&#xff0c;打造增长营销闭环&#xff0c;帮助企业提升数据驱动能力&#xff0c;赋能商业决策、实现业务增长。GrowingIO 专注于零…

MyBatis-Plus框架解析?

简单介绍&#xff1a;MyBatis-Plus&#xff08;简称 MP&#xff09;&#xff08;由苞米豆公司开源&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MP会内置集成部分SQL方法&#xff0c;可以直接…