和733的方法一毛一样,就是改一改就能用的程度~
题目
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例
输入: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]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:递归
Java实现
class Solution {
int maxnum=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){
int sum = pd(grid, i, j, 1, 2);
maxnum=Math.max(maxnum, sum);
}
}
}
return maxnum;
}
public int pd(int[][] grid, int row, int col, int oldColor, int newColor){
int cnt=0;
if (oldColor == newColor) return cnt;
//把自己上色
grid[row][col] = newColor;
cnt++;
//上
if (row - 1 >= 0 && grid[row - 1][col] == oldColor){
cnt+=pd(grid, row - 1, col, oldColor, newColor);
}
//下
if (row + 1 < grid.length && grid[row + 1][col] == oldColor){
cnt+=pd(grid, row + 1, col, oldColor, newColor);
}
//左
if (col - 1 >= 0 && grid[row][col - 1] == oldColor){
cnt+=pd(grid, row, col - 1, oldColor, newColor);
}
//右
if (col + 1 < grid[0].length && grid[row][col + 1] == oldColor){
cnt+=pd(grid, row, col + 1, oldColor, newColor);
}
return cnt;
}
}
方法2:BFS
class Solution {
int sum = 0;
int[] directions = new int[]{-1, 0, 1, 0, -1};
public int maxAreaOfIsland(int[][] grid) {
int row = grid.length, col = grid[0].length;
for (int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if (grid[i][j] == 1) bfs(i, j, row, col, grid);
}
}
return sum;
}
public void bfs(int i, int j, int row, int col, int[][] grid){
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{i, j});
int step = 0;
while (!q.isEmpty()){
int sz = q.size();
for (int ii = 0; ii < sz; ii++){
int[] cur = q.poll();
//如果自身为1,先变成2,代表遍历过
if (grid[cur[0]][cur[1]] == 1) {
grid[cur[0]][cur[1]] = 2;
step++;
}
//向四周扩散
for (int jj = 0; jj < directions.length - 1; jj++){
int x = cur[0] + directions[jj];
int y = cur[1] + directions[jj + 1];
if (x >= row || x < 0 || y >= col || y < 0 || grid[x][y] == 0) continue;
//四周有为1的,变成2,代表遍历过
if (grid[x][y] == 1){
grid[x][y] = 2;
q.offer(new int[]{x, y});
step++;
}
}
}
}
sum = Math.max(sum, step);
}
}