You are given an m x n binary matrix grid. 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.
The area of an island is the number of cells with a value 1 in the island.
Return the maximum area of an island in grid. If there is no island, return 0.
Example 1:
Input: grid = [[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]]
Output: 6
Explanation: The answer is not 11, because the island must be connected 4-directionally.
Example 2:
Input: grid = [[0,0,0,0,0,0,0,0]]
Output: 0
Constraints:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 50
- grid[i][j] is either 0 or 1.
Java Completion:
/**
* 非递归方式求孤岛的最大面积
*/
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
boolean[][] seen = new boolean[row][col];
Stack<int[]> stack = new Stack<>();
int maxArea = 0;
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (grid[r][c] == 1 && !seen[r][c]) {
stack.push(new int[]{r, c});
int area = 0;
while (!stack.isEmpty()) {
int[] top = stack.pop();
int m = top[0];
int n = top[1];
if (m < row && m >= 0 && n < col && n >= 0 && !seen[m][n] && grid[m][n] == 1) {
seen[m][n] = true;
area += 1;
stack.push(new int[]{m + 1, n});
stack.push(new int[]{m - 1, n});
stack.push(new int[]{m, n + 1});
stack.push(new int[]{m, n - 1});
}
}
maxArea = Math.max(maxArea, area);
}
}
}
return maxArea;
}
}