给定一个由0和1组成的非空二维数组grid
,一个岛由一组四联通(上下左右四方向)的1
(表示陆地)组成。假定grid
的四周都是水。
返回最大的岛。(没有岛则返回0)
样例
样例 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
返回6。注意不是11!因为是4方向联通。
样例 2:
[[0,0,0,0,0,0,0,0]]
返回0。
注意事项
grid
中的每一维度长度都不超过50。
解题思路1:
类似于Lintcode 433:岛屿的个数,只不过增加了面积计算
public class Solution {
/**
* @param grid: a 2D array
* @return: the maximum area of an island in the given 2D array
*/
public int maxAreaOfIsland(int[][] grid) {
// Write your code here
if(grid == null || grid.length == 0)
return 0;
int row = grid.length;
int col = grid[0].length;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(grid[i][j] == 1){
tempArea = 0;
helper(grid, i, j);
}
}
}
return maxArea;
}
private int maxArea = 0;
private int tempArea;
private void helper(int[][] grid, int row, int col){
tempArea++;
grid[row][col] = 0;
if(tempArea > maxArea)
maxArea = tempArea;
if(row + 1 < grid.length && grid[row + 1][col] == 1)
helper(grid, row + 1, col);
if(row - 1 >= 0 && grid[row - 1][col] == 1)
helper(grid, row - 1, col);
if(col + 1 < grid[0].length && grid[row][col + 1] == 1)
helper(grid, row, col + 1);
if(col - 1 >= 0 && grid[row][col - 1] == 1)
helper(grid, row, col - 1);
return;
}
}
DFS,简化代码:
public class Solution {
/**
* @param grid: a 2D array
* @return: the maximum area of an island in the given 2D array
*/
public int maxAreaOfIsland(int[][] grid) {
// Write your code here
if(grid == null || grid.length == 0)
return 0;
int maxArea = 0;
int row = grid.length;
int col = grid[0].length;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
maxArea = Math.max(maxArea, dfs(grid, i, j));
}
}
return maxArea;
}
private int dfs(int[][] grid, int row, int col){
if(row <0 || row >= grid.length || col <0 || col >= grid[0].length || grid[row][col] == 0)
return 0;
int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//上右下左
grid[row][col] = 0;
int area = 1;
for(int i=0; i<4; i++) //尝试4个方向
area += dfs(grid, row + dir[i][0], col + dir[i][1]);
return area;
}
}