题目描述:
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.
Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)
思路一:递归 DFS
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int maxArea = 0;
for (int i = 0; i < grid.length; i++)
for (int j = 0; j < grid[0].length; j++)
if (grid[i][j] == 1)
maxArea = Math.max(maxArea, AreaOfIsland(grid, i, j));
return maxArea;
}
private int AreaOfIsland(int[][] grid, int i, int j)
{
if (i >= 0 && i < grid.length && j >= 0 && j < grid[0].length && grid[i][j] == 1)
{
grid[i][j] = 0;
return 1 + AreaOfIsland(grid, i - 1, j) + AreaOfIsland(grid, i + 1, j) + AreaOfIsland(grid, i, j - 1) + AreaOfIsland(grid, i, j + 1);
}
return 0;
}
}
思路二:BFS
class Solution {
public int maxAreaOfIsland(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0)
return 0;
int m = grid.length;
int n = grid[0].length;
boolean[][] visited = new boolean[m][n];
int maxArea = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (!visited[i][j] && grid[i][j] == 1)
maxArea = Math.max(maxArea, bfs(grid, visited, i, j, m, n));
return maxArea;
}
int[][] moves = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
private int bfs(int[][] grid, boolean[][] visited, int i, int j, int row, int col)
{
Queue<int[]> queue = new LinkedList<>();
int area = 1;
queue.add(new int[]{i, j});
visited[i][j] = true;
while (!queue.isEmpty())
{
int[] curr = queue.poll();
for (int[] move : moves)
{
int ii = curr[0] + move[0];
int jj = curr[1] + move[1];
if (ii >= 0 && ii < row && jj >= 0 && jj < col && grid[ii][jj] == 1 && !visited[ii][jj])
{
area++;
queue.add(new int[]{ii, jj});
visited[ii][jj] = true;
}
}
}
return area;
}
}