Leetcode130 Surrounded Regions

題目

Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

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

After running your function, the board should be:

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

中文大意

給定一個二維數組,尋找到其中被“X”包圍的“O”區域,然後將這些區域中的“O”變爲“X”


分析

看到這個題目的第一個想法是先找到所有的被“X”包圍的“O”區域,如果直接尋找比較難,但是我們可以從另一個角度考慮,那就是找到那些不能夠被“X”包圍起來的“O”,而這其間的一個技巧就是:在二維數組的四邊上的“O”是一定無法被“X”包圍進去的,所以從二維數組的四個邊上的“O”到達的“O”都是無法被“X”完全包圍的。

注意:(1)一個“O”被“X”包圍的標準是:“O”的上、下、左、右四個方向是“X”就可以,並不需要“O”的九宮格中的其他八個位置都是“X”。

(2)使用迭代的方法。

(3)考慮二維數組爲0*0的情況、1*n的情況、n*1的情況。


java代碼實現

class Solution {
    public void solve(char[][] board) {
        if(board.length == 0 || board[0].length == 0){
            return;
        }
        if(board.length == 1 || board[0].length == 1)
        {
            return;
        }
        
        int row = board.length;//二維數組的行數
        int col = board[0].length;//二維數組的列數
        for(int i = 0; i < row;i++){
            if(board[i][0] =='O'){//二維數組的第一列
                roadOutter(i,0,board);
            }
            if(board[i][col - 1] == 'O'){//二維數組的最後一列
                roadOutter(i,col - 1,board);
            }
            
        }
        
        for(int j = 0; j<col;j++){//二維數組的第一行
            if(board[0][j] =='O'){
                roadOutter(0,j,board);
            }
            if(board[row -1][j] == 'O'){//二維數組的最後一行
                roadOutter(row-1,j,board);
            }
        }
        
        for(int i = 0;i<row;i++){
            for(int j = 0;j<col;j++){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }else if(board[i][j] == '*'){
                    board[i][j] = 'O';
                }
                
            }
        }
            
        }
        
    
    //下面的方法處理(row,col)位置上的元素,如果爲'O',那麼換爲'*',這樣是爲了區分出這些'O'是無法被'X'包圍的,同時使用迭代的方法,處理(row,col)周圍四個方向上的元素
    public void roadOutter(int row,int col,char[][] board){
        if(row < 0 || row > board.length -1 || col < 0 || col > board[0].length - 1){
            return;
        }
        if(board[row][col] =='O'){
            board[row][col] ='*';
        }
        if(row > 1 && board[row - 1][col] == 'O'){
            roadOutter(row -1 ,col,board);
        }
        if(row < board.length - 1 && board[row + 1][col] == 'O'){
            roadOutter(row+1,col,board);
        }
        if(col > 1 && board[row][col - 1] =='O'){
            roadOutter(row,col -1,board);
        }
        if(col < board[0].length - 1 && board[row][col +1] == 'O'){
            roadOutter(row,col + 1,board);
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章