算法-被围绕的区域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法-被围绕的区域相关的知识,希望对你有一定的参考价值。

做面试题,做面试题!

题意:

给一个二维的矩阵,包含 ‘X‘ 和 ‘O‘, 找到所有被 ‘X‘ 围绕的区域,并用 ‘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
X O X X

这个题才开始看上去根本没有思路,根本就不知道从哪里下手才好。借鉴了其他人的思想,我才知道是怎么做的。

1.解题思路

   这个题最重要的一个特点就是,我们需要将被围绕起来的O换成X,所以只要跟边界连接的O是不能变的。所以这个题的关键是:怎么判断一个O是否是与边界连接的呢?

   在矩阵中有两种O,一种是跟边界连接的O,一种是不与边界连接的O。假设,我们找到了所有与边界连接的O,那么我们可以将这些O换成另一个字符(这里是*),然后重新遍历数组,凡是遇到O的均变成X。这样就能达到我们的目的了。

   那么怎么找到所有与边界连接的O呢?一个矩阵无非是4条边,我们可以从4条边上可以查找O,凡是找到了O,将它替换成为*,然后在递归的查找4个方向。这样我们就能找到所有与边界连接的O了。

2.代码

 1     public void surroundedRegions(char[][] board) {
 2         // write your code here
 3         if(board == null || board.length == 0 || board[0].length == 0){
 4             return ;
 5         }
 6         //遍历第一列和最后一列
 7         for(int i = 0; i < board.length; i++){
 8             //第一列找到了与边界相连的O,进入递归函数,递归查找其他的O
 9             if(board[i][0] == ‘O‘){
10                 search(board, i, 0);
11             }
12             //最后一列
13             if(board[i][board[0].length - 1] == ‘O‘){
14                 search(board, i, board[0].length - 1);
15             }
16         }
17         //遍历第一行和最后一行
18         for(int i = 0; i < board[0].length; i++){
19             if(board[0][i] == ‘O‘){
20                 search(board, 0,i);
21             }
22             if(board[board.length - 1][i] == ‘O‘){
23                 search(board,board.length - 1, i);
24             }
25         }
26         //跟新数组
27         for(int i = 0; i < board.length; i++){
28             for(int j = 0; j < board[0].length; j++){
29                 if(board[i][j] == ‘O‘){
30                     board[i][j] = ‘X‘;
31                 }
32                 if(board[i][j] == ‘*‘){
33                     board[i][j] = ‘O‘;
34                 }
35             }
36         }
37         
38     }
39     private void search(char[][]board, int row, int column){
40         if(row < 0 || column < 0 || row >= board.length || column >= board[0].length){
41             return ;
42         }
43         //记住,这里一定是!= O,因为*和X是不递归的,只有O才递归
44         if(board[row][column] != ‘O‘){
45             return ;
46         }
47         board[row][column] = ‘*‘;
48         //四个方向
49         search(board, row, column - 1);
50         search(board, row, column + 1);
51         search(board, row - 1, column);
52         search(board, row + 1, column);
53     }

 

以上是关于算法-被围绕的区域的主要内容,如果未能解决你的问题,请参考以下文章

130. 被围绕的区域

java刷题--130被围绕的区域

java刷题--130被围绕的区域

130被围绕的区域

130被围绕的区域

LeetCode第130题—被围绕的区域—Python实现