【DFS】130.被围绕的区域

【leetcode-41】【DFS / BFS / 并查集】130.被围绕的区域 题目描述 给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例: 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’。如果两个元素在水平 阅读详情

题目

法1:DFS

典型题目,牢记方法!

Python

class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        m, n = len(board), len(board[0])
        visited = [[False]*n for _ in range(m)]

        for i in range(m):
            for j in range(n):
                if (i == 0 or i == m-1 
                    or j == 0 or j == n-1
                    and board[i][j] == 'O'):
                    self.dfs(board, visited, i, j)
        
        for i in range(m):
            for j in range(n):
                if board[i][j] == 'O' and not visited[i][j]:
                    board[i][j] = 'X'
    
    def dfs(self, board, visited, i, j):
        if (i < 0 or i >= len(board) 
            or j < 0 or j >= len(board[0])
            or board[i][j] == 'X'
            or visited[i][j]):
            return
        visited[i][j] = True
        self.dfs(board, visited, i-1, j)
        self.dfs(board, visited, i+1, j)
        self.dfs(board, visited, i, j-1)
        self.dfs(board, visited, i, j+1)

Java

class Solution {
    public void solve(char[][] board) {
        int m = board.length, n = board[0].length;
        if (m == 0 || n == 0) {
            return;
        }
        boolean[][] visitedO = new boolean[m][n]; // 没有被围绕的'O'位置记录
        for (int i = 0; i < n; ++i) { // 首行
            dfs(board, visitedO, 0, i, m, n);
        }
        for (int i = 0; i < n; ++i) { // 末行
            dfs(board, visitedO, m - 1, i, m, n);
        }
        for (int i = 0; i < m; ++i) { // 首列
            dfs(board, visitedO, i, 0, m, n);
        }
        for (int i = 0; i < m; ++i) { // 末列
            dfs(board, visitedO, i, n - 1, m, n);
        }

        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (board[i][j] == 'O' && !visitedO[i][j]) {
                    board[i][j] = 'X';
                }
            }
        }
    }

    public void dfs(char[][] board, boolean[][] visitedO, int i, int j, int m, int n) {
        if (i >= 0 && i < m 
                && j >= 0 && j < n 
                && board[i][j] == 'O' 
                && !visitedO[i][j]) {
            visitedO[i][j] = true;
            dfs(board, visitedO, i - 1, j, m, n);
            dfs(board, visitedO, i + 1, j, m, n);
            dfs(board, visitedO, i, j - 1, m, n);
            dfs(board, visitedO, i, j + 1, m, n);
        }
    }
}
LeetCode 130题:被围绕区域的BFS与DFS解法详解 图论中的连通区域问题是算法设计的经典场景,BFS(广度优先搜索)和DFS(深度优先搜索)是处理这类问题的两大核心方法。其原理是通过系统性地遍历节点来探索连通关系,在矩阵处理、路径查找等场景具有重要技术价值。以LeetCode 130题为例,该问题要求识别矩阵中被包围的特定区域,通过从边界扩散的逆向思维,BFS/DFS能将时间复杂度优化至O(n^2)。实际工程中,这种思想可应用于图像处理、社交网络分析等领域。针对算法面试,掌握边界条件处理和标记技巧是关键,同时理解BFS队列实现与DFS递归实现的差异能更好应对 阅读详情

相关推荐

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader+Application双备份(含完整代码解析)

本文详细介绍了基于STM32F103VET6微控制器和W25Q64外部Flash实现Bootloader+Application双备份固件升级的完整方案。通过精心设计的Flash分区策略、可靠的Bootloader程序以及包含双重校验和自动回滚机制的升级流程,有效解决了远程升级过程中断电导致设备变砖的风险,确保了工业嵌入式系统的高可靠性与稳定性。

linux的博客 823

LC.130.被围绕的区域(DFS)

LC.130.被围绕的区域(DFS) 思路:将边界上的连通OOO区域跑dfsdfsdfs标记,再对未标记的OOO修改即可。 class Solution { public: vector<vector<int> >vis; int d[4][2]={0,1,0,-1,1,0,-1,0}; int n,m; void dfs(vector<vector<char>>& a,int x,int y){ vi

Harris-H的博客 532

03.Linux下目录动态扩容,以分配home的部分空间给root为例

本篇文章将介绍Linux下分配home目录的部分空间给root目录。大致思路:卸载home,解除其磁盘容量占用->扩容root,增加其磁盘空间->重建恢复home操作演示环境为CentOS系统,其他操作系统例如openEuler也可作为参考。01.Linux下目录扩容,以增加root目录的磁盘容量分配为例操作系统版本如下名称版本CentOS7.6+

ChennyWJS的博客 2337

leetcode130. 被围绕的区域/dfs,bfs

文章目录题目:130. 被围绕的区域基本思想:dfs 题目:130. 被围绕的区域 给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例: 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'。 任何不在边界上,或不与

yyf_blog 569

告别编译报错!STC32G12K128在Keil C251下的完整Target配置指南(附ROM设置详解)

本文详细介绍了STC32G12K128在Keil C251下的完整Target配置指南,包括ROM设置、CPU模式选择、内存模型优化等关键步骤。通过实战技巧和常见错误解决方案,帮助开发者高效搭建编译环境,避免常见报错,充分发挥STC32G系列芯片的性能优势。

weixin_29186249的博客 339

C++ 工程实践(9):数据抽象

陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice  http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/8

陈硕的Blog 1万+

130. 被围绕的区域 DFS

130. 被围绕的区域 难度:中等 题目描述 解题思路 这道题的思路有点巧妙( •̀ ω •́ )y 因为边界上的O和它相邻的O一定不会被标记,所以可以用逆向思维,先把所有边界上的O和和它相邻的O都标记出来,最后把标记还原,没标记过的变成X 1、DFS /* * 130. 被围绕的区域 * 2020/7/18 */ public void solve(char[][] board) { int m = board.length;

hh155715的博客 142

置顶必读(3) |《滚雪球学SpringBoot》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 15万+

Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含'X'和'O'(字母 O)。 找到所有被'X'围绕的区域,并将这些区域里所有的'O'用'X'填充。 示例: X X X X X O O X X X O X X O X X ...

denghan1065的博客 171

RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531

本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2013

QT使用libssh2库通过密匙实现sftp协议上传文件

qt下使用libssh2通过密匙连接sftp服务器端

小米的修行之路 940

面试高频题 力扣 130. 被围绕的区域 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

文章摘要: LeetCode题目“被围绕的区域”要求将矩阵中被X包围的O替换为X,而与边界相连的O保留。解题关键在于逆向思维:先标记所有与边界相连的O区域(安全区),再处理剩余O。核心步骤包括:1) 遍历矩阵四边,用DFS标记连通O为临时符号;2) 二次遍历将未标记O改为X,恢复标记区域为O。该解法通过两次遍历实现原地修改,时间复杂度O(mn)。相比直接检测被包围区域,这种"标记安全区+排除法"的策略更高效,体现了连通性问题中"正难则反"的解题思路。(149字)

Q741_147的博客 1190

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 539

dfs例题 130. 被围绕的区域

dfs例题 https://leetcode-cn.com/problems/surrounded-regions/: 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

WhereIsMyChair的博客 464

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

力扣:130. 被围绕的区域(深度优先算法)

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

老许的博客 206

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

leetcode-130. 被围绕的区域---广度优先算法与深度优先算法

再次遇到 广度优先算法和深度优先算法。leetcode地址 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 示例: 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

every__day的博客 445

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LeetCode 130题详解:深度优先搜索与广度优先搜索解决被围绕的区域

深度解析 LeetCode 130题:深度优先搜索与广度优先搜索解决被围绕的区域

10年数据\经营分析经验,现任大厂数据分析负责人 593

【leetcode】130 被围绕的区域(DFS)

题目链接:https://leetcode-cn.com/problems/surrounded-regions/ 题目描述 给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例: X X X X X O O X X X O X X O X X 运行你的函数后,矩阵变为: X X X X X X X X...

zjwreal 414

力扣-- 被围绕的区域130(DFS深度优先搜索)

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'任何不在边界上,或不与边界上的 'O'相连的 'O'最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。围绕的区域,并将这些区域里所有的。

无聊人的博客 70

leetcode130_被围绕的区域(dfs)

题目 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充 满。 示例 给出二维矩阵: 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 X O X X 解释 被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'都不会被填充...

uestcprince的博客 480

LeetCode 130.被围绕的区域 深度优先搜索DFS+广度优先搜索BFS

深度优先搜索 时间复杂度O(m×n) 空间复杂度O(n×m) //搜索x,y上下左右的方向 void dfs(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]='T'; dfs(board,x+1,y,n,m); dfs(board,x-1,y,n,m); dfs(bo

XingJin_的博客 300

LeetCode 面试经典 150_图_被围绕的区域(89_130_C++_中等)(深度优先搜索:DFS)

LeetCode 面试经典 150_图_被围绕的区域(89_130_C++_中等) 题目描述: 给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' 组成,捕获 所有 被围绕的区域: 连接:一个单元格与水平或垂直方向上相邻的单元格连接。 区域:连接所有 'O' 的单元格来形成一个区域。 围绕:如果您可以用 'X' 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单

huayimenghan的博客 716

【leetcode130】被围绕的区域【dfs】

题目 给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例: 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 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/p...

qq_29295351的博客 176

【LeetCode:130. 被围绕的区域 + DFS】

【LeetCode:130. 被围绕的区域 + DFS】给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' 组成,捕获 所有 被围绕的区域: - 连接:一个单元格与水平或垂直方向上相邻的单元格连接。 - 区域:连接所有 'O' 的单元格来形成一个区域。 - 围绕:如果您可以用 'X' 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。 通过将输入矩阵 board 中的所有 'O' 替换为 'X' 来 捕获被围绕的区域。

Coder_ljw的博客 1129

LeetCode:130 被围绕的区域 dfs

给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 示例: 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’...

AKGWSB 's blog 249

LeetCode:130. 被围绕的区域

130. 被围绕的区域 给定一个二维的矩阵,包含'X'和'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的'O' 用 'X' 填充。 示例: 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'最终都会被填充...

梦~' 329
上一篇: 【重点】【链表】92. 反转链表 II
下一篇: 【重点】【DFS】90.子集II
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值