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); } }