X

LEETCODE 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

运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

解释:

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


如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=130

解题思路分析:

本题的关键在于如何排除与边界相连通的所有 ‘O’ 。因此我们可以从边界上的所有 ‘O’ 着手,分别以他们为起点做dfs处理,找到所有与他们连通的 ‘O’ ,并将他们替换为其他字符比如 ‘A’。这样剩下的 ‘O’ 一定是被 ‘X’ 包围的。我们最后再遍历一遍矩阵上每一个点,遇到 ‘O’ 时替换为 ‘X’,遇到 ‘A’时还原为 ‘O’ 即可。

实现代码:

public void solve(char[][] board) {
    if(board.length==0) return;
    int row=board.length, col=board[0].length;
    // 以第一行与最后一行上的所有'O'为起点做dfs
    // 将所有与他们连通的'O'置换为'A'
    for(int c=0;c<col;c++){
        if(board[0][c]=='O'){
            dfs(board, 0, c);
        }
        if(board[row-1][c]=='O'){
            dfs(board, row-1, c);
        }
    }
    // 以第一列与最后一列上的所有'O'为起点做dfs
    // 将所有与他们连通的'O'置换为'A'
    for(int r=0;r<row;r++){
        if(board[r][0]=='O'){
            dfs(board, r, 0);
        }
        if(board[r][col-1]=='O'){
            dfs(board, r, col-1);
        }
    }
    // 遍历矩阵每一个点,将'O'替换为'X',将'A'替换为'O'
    for(int r=0;r<row;r++){
        for(int c=0;c<col;c++){
            if(board[r][c]=='O'){
                board[r][c]='X';
            }
            if(board[r][c]=='A'){
                board[r][c]='O';
            }
        }
    }
}
int[][] dirs = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
void dfs(char[][] board,int r, int c){
    board[r][c]='A';
    for(int[] d : dirs){
        int row=d[0]+r,col=d[1]+c;
        if(row>=0&&row<board.length&&col>=0&&col<board[0].length
          &&board[row][col]=='O'){
            dfs(board, row, col);
        }
    }
}

本题解法执行时间为1ms。

Runtime: 1 ms, faster than 99.39% of Java online submissions for Surrounded Regions.

Memory Usage: 41.8 MB, less than 40.49% of Java online submissions for Surrounded Regions.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-130-surrounded-regions-解题思路分析/
Categories: leetcode
kwantong: