130. 被围绕的区域

题目:

思路:

【1】首先明确对于图的处理不外乎是广度遍历和深度遍历(递归)两种,而且做多的话会发现,深度耗时更少。其次该题目点出了被海水围绕的就会被淹没,那么不会被淹没的就只有从边界触发的陆地。所以对于第一行,最后一行,第一列,最后一列都需要从这里面进行搜索,看有没有延伸,故需要定义三种状态(或者使用辅助空间,当然是使用变量更节约空间),原本的海水 "X", 原本的陆地 "O" ,不会被淹没的陆地 "a",所以最后一遍的遍历不过是将"a"还原成"O",其余的都会变成 "X" (要么是原本就是"X",要么就是被淹没的 "O" )。

代码展示:

深度搜索的处理:

//时间1 ms 击败 99.69%
//内存42.7 MB 击败 88.91%
class Solution {
    public void solve(char[][] board) {
        // 行数
        int row = board.length;
        // 列数
        int col = board[0].length;
        // 遍历第一行和最后一行
        for (int i = 0; i < col; i++ ){
            infect(0, i, board);
            infect(row-1, i, board);
        }
        // 遍历第一行和最后一行
        for (int i = 0; i < row; i++ ){
            infect(i, 0, board);
            infect(i, col-1, board);
        }
        // 遍历中间部分
        for (int i = 0; i < row; i++ ){
            for (int j = 0; j < col; j++ ){
                if (board[i][j] == 'a'){
                    board[i][j] = 'O';
                }else {
                    board[i][j] = 'X';
                }
            }
        }
    }

    public void infect(int x, int y, char[][] grid){
        //限制条件(首先是上下左右边界,其次是小岛土地判断)
        if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] != 'O'){
            return;
        }
        if(grid[x][y] == 'O'){
            //这里是将岛屿遍历完后变为新标志,表示连接边界的
            grid[x][y] = 'a';
        }
        infect(x - 1, y, grid);
        infect(x + 1, y, grid);
        infect(x, y - 1, grid);
        infect(x, y + 1, grid);

    }
}

 

posted @ 2023-06-30 17:48  忧愁的chafry  阅读(6)  评论(0编辑  收藏  举报