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';
                }
            }
        }
    }
};
相关文章
|
4天前
|
安全 UED
再次上演“空间魔法”,方太重新定义水槽洗碗机的能力边界
9月25日,方太在北京品牌超级体验店发布了全新一代水槽洗碗机Y系列,引发广泛关注。这款产品集水槽、洗碗机、果蔬净化机于一体,解决了传统洗碗机安装复杂、空间占用大等问题,尤其适合中国家庭厨房。自2015年推出首代水槽洗碗机以来,方太通过创新设计,如双层可翻转水流清洗系统和自动顶门透气干燥系统,大幅提升用户体验。此次Y系列不仅解决了洗锅难题,还增加了多功能料理台功能,进一步优化了厨房空间利用。方太凭借持续的技术创新和对中国家庭需求的深刻理解,成功引领了洗碗机市场的变革。
根据阿里巴巴职位层级,你的编程水平在什么位置?(附等级详细要求)
根据阿里巴巴职位层级,你的编程水平在什么位置?(附等级详细要求)
leetcode 130 被围绕的区域
leetcode 130 被围绕的区域
66 0
leetcode 130 被围绕的区域
被围绕的区域(dfs)
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
82 0
被围绕的区域(dfs)
|
数据采集 数据可视化 搜索推荐
网站导航应该这样设计才正确,你应该知道的十个关键点
网站导航的细节设计左右着使用者体验好坏,不管你的网站页面设计得再漂亮,使用者体验不在,自然也留不住浏览者的注意力。从你的网站视觉吸引力、布局,再到文本的运用都是使用者体验的一环,要达到美观与功能之间的平衡,才称得上是一个好网站。
346 0
网站导航应该这样设计才正确,你应该知道的十个关键点
|
机器学习/深度学习 存储 传感器
基于目标导向行为和空间拓扑记忆的视觉导航方法
基于目标导向行为和空间拓扑记忆的视觉导航方法
200 0
基于目标导向行为和空间拓扑记忆的视觉导航方法
|
算法
LeetCode刷题实战130:被围绕的区域
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
112 0
LeetCode刷题实战130:被围绕的区域
|
C++ 索引
LeetCode 训练场:1051. 高度检查器
LeetCode 训练场:1051. 高度检查器
118 0
|
负载均衡 Kubernetes Cloud Native
赛题解析 | 初赛赛道三:服务网格控制面分治体系构建
首届云原生编程挑战赛正在报名中,初赛共有三个赛道,本文主要针对赛道三题目做出剖析,帮助选手更高效的解题。
915 4
赛题解析 | 初赛赛道三:服务网格控制面分治体系构建