leetcode: Surrounded Regions

本文介绍了一种解决矩阵中'O'元素捕获问题的方法。该算法首先从矩阵的四条边界开始,标记所有与边界'O'相连通的'O'。然后再次遍历矩阵,将未标记的'O'替换为'X',而标记过的'O'恢复为'O'。文章重点讨论了如何优化递归过程以避免大数据处理时的时间超限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若矩阵四边全为‘X’,则矩阵内一定全部都要改为‘X’.....所有不全被包围的‘O’一定与四边上的'O'是联通的....因而我们从矩阵四条边入手,向内遍历并标记所有和边上的'O'联通的‘O’...

之后第二次便利矩阵...将O改为X,标记过的改为O即可....

难点在于从四边上的O向内查找并标记联通O的时候,递归在面对大数据时会超时,这就要求我们 向四周递归时要做好剪枝尽量减少递归次数

public class Solution {
    int rows,cols;
    public void solve(char[][] board) {
        rows = board.length;
        if(rows<=2)
        {
            return ;
        }
        cols = board[0].length;
        if(cols<=2)
        {
            return ;
        }
        for(int i=0;i<rows;i++)
        {
            if(board[i][0]=='O')
            {
                fun(i,0,board);
            }
            if(board[i][cols-1]=='O')
            {
                fun(i,cols-1,board);
            }
        }
        for(int j=0;j<cols;j++)
        {
            if(board[0][j]=='O')
            {
                fun(0,j,board);
            }
            if(board[rows][j]=='O')
            {
                fun(rows-1,j,board);
            }
        }
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                if(board[i][j]=='O')
                {
                    board[i][j] = 'X';
                }
                else if(board[i][j]=='*')
                {
                    board[i][j] = 'O';
                }
            }
        }
        return ;
    }
    void fun(int r,int c,char[][] board)
    {
        if(r<0||r>=rows||c<0||c>=cols)
        {
            return ;
        }
        if(board[r][c]=='O')
        {
            board[r][c]='*';
            if(r-1>=0&&board[r-1][c]=='O')
            {
                fun(r-1,c,board);
            }
            if(r+1<=rows-1&&board[r+1][c]=='O')
            {
                fun(r+1,c,board);
            }
            if(c-1>=0&&board[r][c-1]=='O')
            {
                fun(r,c-1,board);
            }
            if(c+1<=cols-1&&board[r][c+1]=='O')
            {
                fun(r,c+1,board);
            }
        }
        return ;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值