Leetcode130. 被围绕的区域

【中等】力扣算法题解析LeetCode130:被围绕的区域 题目要求将矩阵中被'X'完全围绕的'O'区域替换为'X',保留与边界相连的'O'。解决思路分两步: 标记边界区域:通过BFS遍历四条边界,将与边界相连的'O'标记为临时字符'T',并扩展标记所有相邻'O'。 处理矩阵:遍历整个矩阵,将'T'恢复为'O',其余'O'替换为'X'。 优化点:原地修改矩阵,使用BFS避免栈溢出。时间复杂度为O(mn),空间复杂度O(1)。 示例1中,底部边缘的'O'未被捕获,其余内部的'O'被替换。代码通过方向数组实现高效BFS扩展,确保正确性。 阅读详情

Every day a Leetcode

题目来源:130. 被围绕的区域

本题给定的矩阵中有三种元素:

  • 字母 X;
  • 被字母 X 包围的字母 O;
  • 没有被字母 X 包围的字母 O。

本题要求将所有被字母 X 包围的字母 O都变为字母 X ,但很难判断哪些 O 是被包围的,哪些 O 不是被包围的。

注意到题目解释中提到:任何边界上的 O 都不会被填充为 X。 我们可以想到,所有的不被包围的 O 都直接或间接与边界上的 O 相连。

我们可以利用这个性质判断 O 是否在边界上,具体地说:

对于每一个边界上的 O,我们以它为起点,标记所有与它直接或间接相连的字母 O;

最后我们遍历这个矩阵,对于每一个字母:

  • 如果该字母被标记过,则该字母为没有被字母 X 包围的字母 O,我们将其还原为字母 O;
  • 如果该字母没有被标记过,则该字母为被字母 X 包围的字母 O,我们将其修改为字母 X。

解法1:深度优先搜索

我们可以使用深度优先搜索实现标记操作。

在下面的代码中,我们把标记过的字母 O 修改为字母 A。

代码:

/*
 * @lc app=leetcode.cn id=130 lang=cpp
 *
 * [130] 被围绕的区域
 */

// @lc code=start
class Solution
{
public:
    // 主函数
    void solve(vector<vector<char>> &board)
    {
        if (board.empty())
            return;
        int m = board.size(), n = m ? board[0].size() : 0;
        for (int i = 0; i < m; i++)
        {
            dfs(board, i, 0);
            dfs(board, i, n - 1);
        }
        for (int j = 0; j < n; j++)
        {
            dfs(board, 0, j);
            dfs(board, m - 1, j);
        }
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                if (board[i][j] == 'A')
                    board[i][j] = 'O';
                else if (board[i][j] == 'O')
                    board[i][j] = 'X';
            }
    }
    // 辅函数
    void dfs(vector<vector<char>> &board, int x, int y)
    {
        int m = board.size(), n = m ? board[0].size() : 0;
        if (x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'O')
            return;
        board[x][y] = 'A';
        dfs(board, x + 1, y);
        dfs(board, x - 1, y);
        dfs(board, x, y + 1);
        dfs(board, x, y - 1);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n×m),其中 n 和 m 分别为矩阵的行数和列数。深度优先搜索过程中,每一个点至多只会被标记一次。

空间复杂度:O(n×m),其中 n 和 m 分别为矩阵的行数和列数。主要为深度优先搜索的栈的开销。

解法2:广度优先搜索

我们可以使用广度优先搜索实现标记操作。在下面的代码中,我们把标记过的字母 O 修改为字母 A。

代码:

/*
 * @lc app=leetcode.cn id=130 lang=cpp
 *
 * [130] 被围绕的区域
 */

// @lc code=start

// DFS
//  class Solution
//  {
//  public:
//      // 主函数
//      void solve(vector<vector<char>> &board)
//      {
//          if (board.empty())
//              return;
//          int m = board.size(), n = m ? board[0].size() : 0;
//          for (int i = 0; i < m; i++)
//          {
//              dfs(board, i, 0);
//              dfs(board, i, n - 1);
//          }
//          for (int j = 0; j < n; j++)
//          {
//              dfs(board, 0, j);
//              dfs(board, m - 1, j);
//          }
//          for (int i = 0; i < m; i++)
//              for (int j = 0; j < n; j++)
//              {
//                  if (board[i][j] == 'A')
//                      board[i][j] = 'O';
//                  else if (board[i][j] == 'O')
//                      board[i][j] = 'X';
//              }
//      }
//      // 辅函数
//      void dfs(vector<vector<char>> &board, int x, int y)
//      {
//          int m = board.size(), n = m ? board[0].size() : 0;
//          if (x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'O')
//              return;
//          board[x][y] = 'A';
//          dfs(board, x + 1, y);
//          dfs(board, x - 1, y);
//          dfs(board, x, y + 1);
//          dfs(board, x, y - 1);
//      }
//  };

// BFS
class Solution
{
private:
    vector<int> direction{-1, 0, 1, 0, -1};

public:
    // 主函数
    void solve(vector<vector<char>> &board)
    {
        if (board.empty())
            return;
        int m = board.size(), n = m ? board[0].size() : 0;
        queue<pair<int, int>> q;
        // 从最外围开始,初始化队列
        for (int i = 0; i < m; i++)
        {
            if (board[i][0] == 'O')
            {
                q.push(pair<int, int>{i, 0});
                board[i][0] = 'A';
            }
            if (board[i][n - 1] == 'O')
            {
                q.push(pair<int, int>{i, n - 1});
                board[i][n - 1] = 'A';
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (board[0][j] == 'O')
            {
                q.push(pair<int, int>{0, j});
                board[0][j] = 'A';
            }
            if (board[m - 1][j] == 'O')
            {
                q.push(pair<int, int>{m - 1, j});
                board[m - 1][j] = 'A';
            }
        }
        // BFS遍历
        while (!q.empty())
        {
            auto [r, c] = q.front();
            q.pop();
            for (int k = 0; k < 4; k++)
            {
                int x = r + direction[k], y = c + direction[k + 1];
                if (x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'O')
                    continue;
                q.push(pair<int, int>{x, y});
                board[x][y] = 'A';
            }
        }
        // 最终修改
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                if (board[i][j] == 'A')
                    board[i][j] = 'O';
                else if (board[i][j] == 'O')
                    board[i][j] = 'X';
            }
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n×m),其中 n 和 m 分别为矩阵的行数和列数。广度优先搜索过程中,每一个点至多只会被标记一次。

空间复杂度:O(n×m),其中 n 和 m 分别为矩阵的行数和列数。主要为广度优先搜索的队列的开销。

手把手教你用Wireshark抓包分析BLE广播包:从PDU结构到AD Type实战解析 本文详细介绍了如何使用Wireshark工具抓取并分析BLE广播包,从PDU结构到AD Type的实战解析。通过硬件设备选择、软件配置、协议栈解析及高级故障排查,帮助开发者深入理解蓝牙低功耗通信机制,提升物联网设备调试效率。 阅读详情

相关推荐

长上下文技术的底层逻辑:Attention、压缩、缓存与跨页推理

如果把模型的参数视为“固化智能”,动态智能(Dynamic Intelligence)——模型不必依赖训练时的记忆,而是可以随时调用外部信息。这一点正在改变大模型的范式:Prompt 不再是输入,而是“操作系统事件”文档不再是知识,而是“模型的临时记忆”模型不再是一段神经网络,而是一个“具备阅读循环的推理引擎”当我们把上下文从 128K 拉到百万级,我们做的不是扩容,而是让模型第一次拥有阅读、回溯、定位、跨页分析的能力。这是一种新的智能。

aifs2025的博客 998

LeetCode 130 被围绕的区域 Java

给定一个二维的矩阵,包含 ‘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’。...

Cypresszky的博客 255

【AI助力科研】不看一篇文献,手把手教你用chatGPT写文献综述!

这篇文章以【AI助力科研】为题,介绍了如何利用ChatGPT编写文献综述的方法。作者通过详细的指导,展示了不需要阅读大量文献,只需依靠ChatGPT模型即可完成文献综述的过程。该方法旨在提高科研工作者的效率,减少阅读负担,并且能够生成具有逻辑性和准确性的文献综述。

研究方向//图像视频处理/信号算法/红外无损检测/数值仿真/机器学习/优化算法/python/matlab 2万+

leetcode:130. 被围绕的区域

题目来源 leetcode:130. 被围绕的区域 题目描述 题目解析 本题中的矩阵中有三种元素: 字母X 被字母X包围的字母O 没有被字母X包围的字母O 本题要求将所有被字母X包围的字母O都变为X,但是很难判断哪些O是被包围的,哪些O不是被包围的。 本题思考方向应该是,两种不同状态的 O 之间的不同区别。那么题,本质是:一个矩阵中有 3 个不同的元素,但是目前有2种元素(O)被混淆在一起,需要把这三种元素区分开来。 解题的重点放在2种不同 的 O 之间的区别: 题目中解释说:任何边界上的O都

OceanStar的博客 628

C++调用海康相机SDK采集图像(C++\QT Creator\openCV\线程\接口)

C++调用海康相机SDK采集图像(C++\QT Creator\openCV\线程\接口) 之前写了一篇关于C++调用海康相机SDK采集图像的文章,有很多人私下发送消息咨询了一些问题,由于工作繁忙,只答复了一部分问题,今天抽出时间从头梳理了一下大家提出的问题,把我能够回答的问题都解答一次。上一次的程序只是简单的实现了图像的采集,没有使用到线程,今天把程序重新做出调整,把线程和多态加进去。文章最后有项目的下载地址。 我使用的是QT Creator这个IDE,版本信息如下: 我把相机采集的图像转换为openC

大樱桃的博客 1万+

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

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’。如果两个元素在水平或垂直

pukka的博客 396

SAP S4 MM模块自动记账全流程解析:从评估范围到科目分组的实战配置

本文深入解析SAP S4 MM模块自动记账的全流程,从核心概念评估范围与评估控制入手,详细阐述了评估类、科目分组等关键配置的逻辑关系。通过实战配置步骤,指导如何建立从物料移动(如收货、发料)到自动生成准确财务凭证的完整体系,确保库存价值与总账实时同步,为企业构建可靠的财务业务一体化基石。

weixin_29313547的博客 425

LeetCode——130. 被围绕的区域

广搜,发现了自己写代码的一个小毛病。

weixin_44750790的博客 328

02-基于ART-PI开发板创建USB CDC 虚拟串口设备

本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。

arm_fan的专栏 1886

EB tresos配置指南:CAN通信信号收发全流程解析

本文详细解析了使用EB tresos配置工具实现AUTOSAR架构下CAN通信信号收发功能的全流程。从环境准备、COM模块信号定义、PduR路由配置、CanIf硬件抽象到CAN驱动层设置,提供了清晰的步骤指南和关键配置要点,帮助开发者快速打通从应用层到物理层的数据链路,实现可靠的CAN通信。

weixin_29192141的博客 512

LeetCode第 130 题:被围绕的区域(C++)

130. 被围绕的区域 - 力扣(LeetCode) 问题其实就是如何判断一个 ‘O’ 是否是被 ‘X’ 围绕的: 被围绕的区间显然不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 而任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。 那我们其实就只需要将与边界相连的 ‘O’ 找出来,然后把剩下的 ‘O’ 全部修改为 ‘X’ 就可以了。一共需要考虑四个边界,上下左右: dfs遍历: class Solution { public: int

zj 923

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1906

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

通过将输入矩阵 board 中的所有 ‘O’ 替换为 ‘X’ 来 捕获被围绕的区域。

yyh520025的博客 1027

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode 力扣 130. 被围绕的区域

题目描述(中等难度) 有一点点像围棋,把被 X 围起来的 O 变成 X,边界的 O 一定不会被围起来。如果 O 和边界的 O 连通起来,那么这些 O 就都算作不被围起来,比如下边的例子。 X X X X X O O O X X X X X O X X O X X X 上边的例子就只需要变化 1 个 O 。 X X X X X O O O X X X X X X X X O X X X 解法一 把...

wind_liang的博客 1431

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Leetcode 130. 被围绕的区域 C++

Leetcode 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’

weixin_43750513的博客 462

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode第130题_被围绕的区域

给你一个m x n的矩阵board,由若干字符'X'和'O'组成,找到所有被'X'围绕的区域,并将这些区域里所有的'O'用'X'填充。被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'都不会被填充为'X'。任何不在边界上,或不与边界上的'O'相连的'O'最终都会被填充为'X'。如果两个元素在水平或垂直方向相邻,则称它们是"相连"的。

qq_40263592的博客 2103

力扣第130题:被围绕的区域

本题通过深度优先搜索(DFS)对矩阵中与边界相连的'O'进行标记,确保它们不会被改变。通过这种方式,我们有效地解决了被围绕的区域修改问题。

weixin_48941116的博客 1078

leetcode 130.被围绕的区域

原题 130.被围绕的区域 2020年8月11日 每日一题 题解 矩阵中无非两种字母X或者O。而O分两种,一种是边界上的以及通过O可以连接到边界的,另一种则是无法通过自己或者其他的O连接到边界的O的,我们需要改变的是后一种O,也就是说,可以由每一个边界上的O向四周扩展到所有的外围O,剩下的O改成X。 那么为了标记边界的O,我们每每触及到一个边界O,可把它换为另一个符号,比如临时把O改成A,如此处理完后,再把得到的矩阵,按照A->O以及O->X的方法变换即可。以下的方法一和方法二将会说明实现这个

zhuruihe2014的博客 247

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

Leetcode130(力扣130):被围绕的区域

先使用DFS感染边界区域,再改变非边界区域,最后把边界区域还原。 class Solution { public: void solve(vector<vector<char>>& board) { for(int i=0;i<board.size();i++) { for(int j=0;j<board[0].size();j++) { if((i == 0 || j == 0 |.

weixin_44537258的博客 310

LeetCode-130. 被围绕的区域

LeetCode-130. 被围绕的区域一、题目内容二、题解过程1、遍历算法分析2、解法2.1 方法一:深度优先搜索2.2 方法二:广度优先遍历 -.- 这题不会做,记录下大佬的题解(难度:中等) 一、题目内容 给定一个二维的矩阵,包含 ‘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

weixin_40563850的博客 328

LeetCode130-被围绕的区域

LeetCode130-被围绕的区域 题目 给定一个二维的矩阵,包含 ‘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’ 最终都

viva_la__vida的博客 162

LeetCode 130. 被围绕的区域 | Python

使用深度优先搜索、广度优先搜索的思路,解决 LeetCode《130. 被围绕的区域》问题

"大梦三千秋的博客 861

LeetCode130 被围绕的区域

LeetCode130 被围绕的区域 题目 给你一个 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",

lizefeng1998的博客 221

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
上一篇: Leetcode1217. 玩筹码
下一篇: Leetcode646. 最长数对链
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值