Leetcode 被围绕的区域

算法思想(解题思路):
这道题的核心是 将所有被边界包围的 'O' 保留下来,而将其他被围绕的 'O' 转换为 'X'。为了实现这一目标,我们可以分三步完成:
第一步:标记边界及其相连的 'O' 为特殊标记(例如 'E')
-
目标:
- 找到所有与矩阵边界相连的
'O',将它们和与它们直接相连的所有'O'标记为一个特殊字符(比如'E')。 - 这些
'O'是不能被包围的,因为它们直接或间接与边界相连。
- 找到所有与矩阵边界相连的
-
方法:
- 使用深度优先搜索(DFS)或广度优先搜索(BFS)从矩阵边界上的
'O'开始,向四个方向扩散,将与边界相连的'O'都标记为'E'。 - 这样,剩下的
'O'就是被完全包围的。
- 使用深度优先搜索(DFS)或广度优先搜索(BFS)从矩阵边界上的
第二步:遍历整个矩阵,处理不同状态的字符
-
目标:
- 将矩阵中所有剩下的
'O'转换为'X',因为这些'O'是被完全包围的区域。 - 将之前标记为
'E'的字符还原为'O',因为它们是不被包围的。
- 将矩阵中所有剩下的
-
方法:
- 遍历矩阵中的每一个元素,根据字符值进行判断:
- 如果是
'O',说明是被完全包围的区域,改为'X'。 - 如果是
'E',说明是边界或与边界相连的'O',改回'O'。
- 如果是
- 遍历矩阵中的每一个元素,根据字符值进行判断:
第三步:输出最终结果
经过上述处理,矩阵会满足题目要求,所有被包围的 'O' 转换为 'X',而没有被包围的 'O' 保留下来。
算法流程详解:
-
初始化矩阵大小:
- 首先判断输入矩阵是否为空。如果为空,直接返回。
-
标记边界:
- 遍历矩阵的 四个边界(第一行、最后一行、第一列、最后一列)。
- 对边界上的每个
'O',用DFS递归标记其相连的'O'为'E'。
-
遍历矩阵并修改字符:
- 遍历矩阵中的所有元素:
- 如果当前字符是
'O',说明它是被包围的,转换为'X'。 - 如果当前字符是
'E',说明它是与边界相连的,还原为'O'。
- 如果当前字符是
- 遍历矩阵中的所有元素:
时间与空间复杂度分析:
-
时间复杂度:
O(m * n)- 遍历矩阵的每个单元格一次,并且在标记边界时每个单元格也最多访问一次。
-
空间复杂度:
- 递归栈空间:使用DFS时,递归深度与矩阵的大小相关,最坏情况下需要
O(m * n)的栈空间。
- 递归栈空间:使用DFS时,递归深度与矩阵的大小相关,最坏情况下需要
示例说明:
输入:
board = [['X', 'X', 'X', 'X'],['X', 'O', 'O', 'X'],['X', 'X', 'O', 'X'],['X', 'O', 'X', 'X']
]
执行过程:
-
标记边界:
- 第一步遍历边界:发现
(3,1)是'O',并通过DFS标记与其相连的所有'O'为'E'。 - 标记后的矩阵:
[['X', 'X', 'X', 'X'],['X', 'O', 'O', 'X'],['X', 'X', 'O', 'X'],['X', 'E', 'X', 'X'] ]
- 第一步遍历边界:发现
-
遍历矩阵修改字符:
- 将所有未标记的
'O'转换为'X'。 - 将标记为
'E'的字符还原为'O'。 - 最终矩阵:
[['X', 'X', 'X', 'X'],['X', 'X', 'X', 'X'],['X', 'X', 'X', 'X'],['X', 'O', 'X', 'X'] ]
- 将所有未标记的
输出:
[['X', 'X', 'X', 'X'],['X', 'X', 'X', 'X'],['X', 'X', 'X', 'X'],['X', 'O', 'X', 'X']
]
总结:
通过将与边界相连的 'O' 特殊标记,我们可以有效区分哪些 'O' 是被围绕的,最终实现题目要求。
class Solution {public void solve(char[][] board) {if(board == null || board.length == 0) return;//获取矩阵的行和列int rows = board.length;int cols = board[0].length;for(int i = 0; i < rows; i++) {if(board[i][0] == 'O') {dfs(board, i, 0);}if(board[i][cols - 1] == 'O') {dfs(board, i, cols - 1);}}for(int j = 0; j < cols; j++) {if(board[0][j] == 'O') {dfs(board, 0, j);}if(board[rows - 1][j] == 'O') {dfs(board, rows - 1, j);}}//然后将剩下的O转换为X, E 转换回 Ofor(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {if(board[i][j] == 'O') {board[i][j] = 'X';}if(board[i][j] == 'E') {board[i][j] = 'O';}}}}private void dfs(char[][] board, int row, int col) {//首先检查是否越界if(row < 0 || row >= board.length || col < 0 || col >= board[0].length || board[row][col] != 'O') {return;}//将O标记为Eboard[row][col] = 'E';dfs(board, row + 1, col);dfs(board, row - 1, col);dfs(board, row, col + 1);dfs(board, row, col - 1);}
}
相关文章:
Leetcode 被围绕的区域
算法思想(解题思路): 这道题的核心是 将所有被边界包围的 O 保留下来,而将其他被围绕的 O 转换为 X。为了实现这一目标,我们可以分三步完成: 第一步:标记边界及其相连的 O 为特殊标记ÿ…...
ssm框架-spring-spring声明式事务
声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作! 使用声明式事务可以将事务的控制和业务逻辑分离开来,提…...
React第五节 组件三大属性之 props 用法详解
特性 a、props最好是仅限于父子上下级之间的数据传递,如果是祖孙多级之间传递属性,可以考虑使用props是否合适,或者使用替代方案 useContext() 或者使用 redux状态管理; b、props 中的属性是只读属性,如果想修改其中的…...
测评部署和管理 WordPress 最方便的面板
新版宝塔面板快速搭建WordPress新手教程 - 倚栏听风-Morii - 博客园 初学者使用1Panel面板快速搭建WordPress网站 - 倚栏听风-Morii - 博客园 可以看到,无论是宝塔还是1Panel,部署和管理WordPress都有些繁琐,而且还需要额外去配置Nginx和M…...
【系统分析师】-2024年11月论文-论DevOps开发
1、题目要求 论Devops及其应用。Devops是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通,协作与整合。它是一种重视软体开发人员和工厂运维技术人员之间沟通合作的模式。透过自动化“软件交付”和“架构变更”的流程&…...
算法【子数组最大累加和问题与扩展】
子数组最大累加和问题是一个非常经典的问题,也比较简单。但是扩展出的问题很多,在笔试、面试中特别常见,扩展出的问题很多非常有趣,解法也比较巧妙。 下面通过一些题目来加深理解。 题目一 测试链接:https://leetcode…...
小程序23-页面的跳转:navigation 组件详解
小程序中,如果需要进行跳转,需要使用 navigation 组件,常用属性: 1.url :当前小程序内的跳转链接 2.open-type:跳转方式 navigate:保留当前页面,跳转应用内的某个页面,…...
AI社媒引流工具:解锁智能化营销的新未来
在数字化浪潮的推动下,社交媒体成为品牌营销的主战场。然而,面对海量的用户数据和日益复杂的运营需求,传统营销方法显得力不从心。AI社媒引流王应运而生,帮助企业在多平台中精准触达目标用户,提升营销效率和效果。 1.…...
【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用
Node.js 是一种强大的 JavaScript 运行时,广泛用于构建现代 Web 应用和 API。然而,由于其开放性和异步特性,Node.js 应用容易受到多种安全威胁的攻击,比如 SQL 注入、跨站脚本 (XSS) 和拒绝服务攻击 (DoS)。在本文中,我…...
Docker 用法详解
文章目录 一、Docker 快速入门1.1 部署 MYSQL1.2 命令解读: 二、Docker 基础2.1 常见命令:2.1.1 命令介绍:2.1.2 演示:2.1.3 命令别名: 2.2 数据卷:2.2.1 数据卷简介:2.2.2 数据卷命令ÿ…...
Python小游戏28——水果忍者
首先,你需要安装Pygame库。如果你还没有安装,可以使用以下命令进行安装: 【bash】 pip install pygame 《水果忍者》游戏代码: 【python】 import pygame import random import sys # 初始化Pygame pygame.init() # 设置屏幕尺寸 …...
Kafka Offset 自动提交和手动提交 - 漏消费与重复消费
目录 1. 引言 2. Offset 提交方式概述 2.1 自动提交 Offset 2.2 手动提交 Offset 3. 漏消费与重复消费的问题分析 3.1 自动提交模式下的漏消费和重复消费 漏消费 重复消费 3.2 手动提交模式下的漏消费和重复消费 漏消费 重复消费 4. 自动提交与手动提交的选择 4.1…...
Vue3父组件和子组件
子组件暴露方法给父组件,父组件传值 子组件 const editCalendar (value: string) > {console.log(获取父组件的值, value)};//暴露给外部调用defineExpose({editCalendar,}); 父组件 <template> <CalendarEdit ref"editRef" /> </…...
Linux 定时任务全解析
文章目录 一、Cron 服务1.1安装1.2配置文件格式1.3使用方法1.4系统级与用户级 Cron 任务区别 二、At 服务2.1安装2.2工作原理2.3使用方法 一、Cron 服务 1.1安装 在大多数 Linux 发行版中,Cron 服务通常已经默认安装。例如在 Ubuntu 系统中,可以通过以…...
XLNet——打破 BERT 局限的预训练语言模型
近年来,深度学习在自然语言处理(NLP)领域取得了革命性进展,其中 BERT 的出现标志着双向语言建模的强大能力。然而,BERT 也存在一些局限性,限制了其在生成任务中的表现。2019 年,由 Google 和 Ca…...
开源代码统计工具cloc的简单使用
一.背景 公司之前开发了个小系统,要去申请著作权,需要填写代码数量。应该怎么统计呢?搜索了一下,还是用开源工具cloc吧!我的操作系统是windows,代码主要是java项目和vue项目。 二.到哪里找 可以去官方下载…...
如何创建一个项目用于研究element-plus的原理
需求:直接使用element-plus未封装成组件的源码,创建一个项目,可以使用任意的element-plus组件,可以深度研究组件的运行。例如研究某一个效果,如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码…...
单片机进阶硬件部分_day2_项目实践
设计要求 从绘制原理图到画PCB板,完成智能云衣柜项目 STM32 (Modbus)云IOT衣物云端管理 华为PCB布线规范 基于IoT的智享家主控系统 步骤分析 需求分析 器件选型绘制原理图(器件连接)PCB布局、布线泪滴、铺铜、添加丝印…...
labview关于文件路径的问题
在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数,最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中,应用程序目录更像是根目录,往下拆分成了各个VI的子目录。 接下来我们来拆…...
72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!
本期精选 SCI&EI ●IEEE 1区TOP 计算机类(含CCF); ●EI快刊:最快1周录用! 知网(CNKI)、谷歌学术期刊 ●7天录用-检索(100%录用),1周上线; 免费稿件评估 免费匹配…...
生成剧本杀软件2025推荐,创新剧情设计工具引领潮流
剧本杀软件2025推荐,创新剧情设计工具引领潮流随着剧本杀市场的蓬勃发展,越来越多的创作者和玩家对剧本杀软件的需求日益增长。为了帮助大家在众多选择中找到最适合自己的工具,本文将推荐一款在2025年备受瞩目的剧本杀软件——量子探险AI漫剧…...
AI时代程序员必看!揭秘Harness Engineerin
当AI智能体开始批量编写代码,程序员会失业吗?OpenAI的一个实验给出了惊人答案:在一次实验中,3名工程师配合1500个AI智能体,竟在5个月内完成了100万行代码的产品开发——人类一行代码都没写!但背后真正的秘密…...
YimMenu终极指南:5分钟学会GTA5最强安全增强工具
YimMenu终极指南:5分钟学会GTA5最强安全增强工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程 视频会议已成为现代远程协作的核心工具,而WebRTC技术让浏览器间的实时音视频通信变得触手可及。但当你需要支持10人以上的高清会议时,单纯的P2P连接就会暴露出带宽和性能瓶颈…...
避开带宽陷阱:用低成本示波器搞定MIPI CSI-2信号的眼图与时序分析
避开带宽陷阱:用低成本示波器搞定MIPI CSI-2信号的眼图与时序分析 当你手头只有一台几百MHz带宽的示波器,却要分析动辄上Gbps的MIPI CSI-2高速信号时,是否感到无从下手?别担心,这篇文章将带你突破硬件限制,…...
宠物管理系统|基于springboot+vue的宠物管理系统(源码+数据库+文档)
宠物管理系统 目录 基于springbootvue的宠物管理系统 一、前言 二、系统功能演示 完整操作流程 部署视频已录制完成 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springbootvue的宠物管理系…...
WarcraftHelper:魔兽争霸III体验增强与兼容性优化工具
WarcraftHelper:魔兽争霸III体验增强与兼容性优化工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专注于解决魔兽…...
从B站收藏夹到本地硬盘:3步掌握BiliTools高效下载管理
从B站收藏夹到本地硬盘:3步掌握BiliTools高效下载管理 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 还…...
打卡信奥刷题(3066)用C++实现信奥题 P6877 [JOI 2020 Final] 只不过是长的领带 / Just Long Neckties
P6877 [JOI 2020 Final] 只不过是长的领带 / Just Long Neckties 题目描述 JOI 公司发明了一种领带,一共有 N1N1N1 条领带,编号为 111 到 N1N1N1,第 iii 条领带的长度为 AiA_iAi。 JOI 公司开了一个派对,派对中有 NNN 名员工…...
保姆级教程:用Cadence Virtuoso从零搭建0.18um工艺的Bandgap基准电路
从零构建0.18μm工艺带隙基准电路的实战指南 在模拟集成电路设计中,带隙基准电压源(Bandgap Reference)堪称"电路设计皇冠上的明珠"。它能为各类芯片提供与温度、电源电压几乎无关的稳定参考电压,是ADC、DAC、LDO等模块的核心基础。本文将带您…...
