做面试题,做面试题!
题意:
给一个二维的矩阵,包含 ‘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 }
时间: 2024-10-08 10:21:28