题目大意:
被围绕的区域
给定一个二维的矩阵,包含 '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-解题思路分析/