695. 岛屿的最大面积

74 阅读1分钟

思路

遇到一个1后,计数+1,继续搜,每遇到一个1,计数+1,直到搜不到。

方法一: DFS

思路:每调用一次DFS函数,说明又找到了一个1,计数+1,直到:

  • 超出边界
  • 搜到的不是1.
class Solution {
   int max = 0;
   int curMax = 0;
   public int maxAreaOfIsland(int[][] grid) {
       int width = grid.length;
       int length = grid[0].length;
       for (int i = 0; i < width; i++) {
           for (int j = 0; j < length; j++) {
               if (grid[i][j] == 1) {
                   dfs(i, j, grid);
                   curMax = 0;
               }
           }
       }
       return max;
   }
   public void dfs(int i, int j, int[][] grid) {
       if (i >= grid.length || j >= grid[0].length || i < 0 || j < 0 || grid[i][j] != 1) {
           return;
       }
       grid[i][j] = 2;//置为2的话如果想复原原数组,可以再遍历复原,置为0 就找不回来了
       curMax++;
       max = Math.max(curMax, max);
       dfs(i, j + 1, grid);
       dfs(i, j - 1, grid);
       dfs(i + 1, j, grid);
       dfs(i - 1, j, grid);
       //curMax = 0; 在这里归零是错的,因为dfs并没有结束,
       //上面的四个dfs的后面,并不一定是最外层的走完了,可能是里层调用的四个dfs走完了
       //因此应该在最外层后再置零,即在上面dfs(i, j, grid)处
   }
}

方法二:BFS

思路:每加一个元素到队列,计数+1

错误做法

class Solution {
    int max = 0;
    public int maxAreaOfIsland(int[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    dfs(grid, i, j, 0);
                }
            }
        }
        return max;
    }

    public void dfs(int[][] grid, int i, int j, int curMax) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != 1) {
            return;
        }
        grid[i][j] = 2;
        max = Math.max(max, curMax + 1);
        dfs(grid, i + 1, j, curMax + 1);
        dfs(grid, i - 1, j, curMax + 1);
        dfs(grid, i, j + 1, curMax + 1);
        dfs(grid, i, j - 1, curMax + 1);
    }
}