leetcode-130:被围绕的区域

简介: leetcode-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","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

输入:board = [["X"]]
输出:[["X"]]

解题

方法一:dfs

转化为从边缘的O开始dfs,对其进行标记。那么没有标记的O就是需要转化为X

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

方法二:并查集

将边界的O都和dummy连接起来,其他的O4个方向的O连接起来。

最后只要将不与dummy连接的O转为X即可

class UnionFind{
private:
    vector<int> parent;
public:
    UnionFind(int m){
        parent.resize(m);
        iota(parent.begin(),parent.end(),0);
    }
    int find(int index){
        if(index==parent[index]) return index;
        return parent[index]=find(parent[index]);
    }
    void unite(int index1,int index2){
        parent[find(index1)]=find(index2);
    }
    bool isConnect(int index1,int index2){
        return find(index1)==find(index2);
    }
};
class Solution {
private:
    int m,n;
    int node(int i,int j){
        return i*n+j;
    }
public:
    void solve(vector<vector<char>>& board) {
        m=board.size(),n=board[0].size();
        UnionFind uf(m*n+1);
        int dummyIndex=m*n;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j]=='X') continue;
                if(i==0||j==0||i==m-1||j==n-1){
                    uf.unite(node(i,j),dummyIndex);
                }else{
                    if(i>0&&board[i-1][j]=='O'){
                        uf.unite(node(i,j),node(i-1,j));
                    }
                    if(i<m-1&&board[i+1][j]=='O'){
                        uf.unite(node(i,j),node(i+1,j));
                    }
                    if(j>0&&board[i][j-1]=='O'){
                        uf.unite(node(i,j),node(i,j-1));
                    }
                    if(j<n-1&&board[i][j+1]=='O'){
                        uf.unite(node(i,j),node(i,j+1));
                    }
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(uf.isConnect(node(i,j),dummyIndex)){
                    board[i][j]='O';
                }else{
                    board[i][j]='X';
                }
            }
        }
    }
};
相关文章
|
JSON 前端开发 数据格式
12306火车票查询--Python可以这么玩!!!
12306火车票查询--Python可以这么玩!!!
|
10月前
|
人工智能 自然语言处理 程序员
通义灵码×DeepSeek 实战:打造一款小游戏,分享给朋友玩
通义灵码×DeepSeek 实战:打造一款小游戏,分享给朋友玩
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
30205 0
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
318 4
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
299 4
|
运维 Linux Shell
从Linux小白到大神的逆袭之路:解锁高级自测秘籍,让你的Linux技能瞬间燃爆,成为运维界的超级英雄!
【8月更文挑战第5天】Linux作为开源世界的基石,凭借其强大功能与高度可定制性,吸引着众多技术爱好者与专业人士。对于希望精进Linux系统管理的学习者来说,“Linux高级自测学习”是一次技术深潜之旅,也是对个人极限的挑战。本学习路径首先回顾基础操作,并进阶至LVM磁盘管理、系统性能优化、复杂网络配置与安全、自动化运维及容器化技术等领域。通过实践与探索,你将逐步解锁Linux潜力,成为高手。技术之路永无止境,保持好奇与求知心至关重要。
251 4
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
124 2
|
Python
【Leetcode刷题Python】416. 分割等和子集
LeetCode 416题 "分割等和子集" 的Python解决方案,使用动态规划算法判断是否可以将数组分割成两个元素和相等的子集。
199 1
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
270 0
【Leetcode刷题Python】73. 矩阵置零
静态资源路径访问不到的问题,Whitelabel Error Page,There was an unexpected error,解决bug的好方法,大量翻看别人的文章,终究是粗心惹的祸
静态资源路径访问不到的问题,Whitelabel Error Page,There was an unexpected error,解决bug的好方法,大量翻看别人的文章,终究是粗心惹的祸

热门文章

最新文章