给你一个大小为 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
采用深度优先搜索
int dfs(int** grid,int gridSize,int* gridColSize,int row,int col)
{
if(row<0||row>=gridSize||col<0||col>=gridColSize[0]||grid[row][col]==0)
return 0;
grid[row][col]=0;
return 1+dfs(grid,gridSize,gridColSize,row+1,col)+dfs(grid,gridSize,gridColSize,row-1,col)+dfs(grid,gridSize,gridColSize,row,col+1)+dfs(grid,gridSize,gridColSize,row,col-1);
}
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize) {
int area,max=0;
for(int i=0;i<gridSize;i++)
{
for(int j=0;j<gridColSize[0];j++)
{
area=dfs(grid,gridSize,gridColSize,i,j);
max=max>area?max:area;
}
}
return max;
}
在leetcode的官网解题中给出了一种深度优先搜索+栈的解决方法
在深度搜先搜索的同时把接下来想要遍历的土地放在栈里,然后在取出这些土地的时候访问它们。访问每一片土地时,我们将对围绕它四个方向进行探索,找到还未访问的土地,加入到栈 stack 中,只要栈 stack 不为空,就说明我们还有土地待访问,那么就从栈中取出一个元素并访问。
给出python写法
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
ans = 0
for i, l in enumerate(grid):
for j, n in enumerate(l):
cur = 0
stack = [(i, j)]
while stack:
cur_i, cur_j = stack.pop()
if cur_i < 0 or cur_j < 0 or cur_i == len(grid) or cur_j == len(grid[0]) or grid[cur_i][cur_j] != 1:
continue
cur += 1
grid[cur_i][cur_j] = 0
for di, dj in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
next_i, next_j = cur_i + di, cur_j + dj
stack.append((next_i, next_j))
ans = max(ans, cur)
return ans