时间复杂度:O(n²)
解题思路
广度优先搜索。创建一个visit二维数组记录grid每个元素的访问情况,创建一个q作为队列存放待访问的元素坐标。遍历grid的每个元素,每遇到一个为1的元素且未被访问过就开始BFS,得到面积后更新最大面积。
在BFS中对四个方向进行判断,如果满足条件就更新visit的对应位置为true,然后将坐标入队,最后返回面积。
AC代码
func maxAreaOfIsland(grid [][]int) int {
res:=0
m,n:=len(grid),len(grid[0])
visit:=make([][]bool,m)
for i:=0;i<m;i++{
visit[i]=make([]bool,n)
}
q:=[][]int{}
bfs:=func()int{
area:=0
for len(q)>0{
area++
i,j:=q[0][0],q[0][1]
q=q[1:]
if i>0&&grid[i-1][j]==1&&!visit[i-1][j]{
q=append(q,[]int{i-1,j})
visit[i-1][j]=true
}
if j<n-1&&grid[i][j+1]==1&&!visit[i][j+1]{
q=append(q,[]int{i,j+1})
visit[i][j+1]=true
}
if i<m-1&&grid[i+1][j]==1&&!visit[i+1][j]{
q=append(q,[]int{i+1,j})
visit[i+1][j]=true
}
if j>0&&grid[i][j-1]==1&&!visit[i][j-1]{
q=append(q,[]int{i,j-1})
visit[i][j-1]=true
}
}
return area
}
for i:=0;i<m;i++{
for j:=0;j<n;j++{
if grid[i][j]==1&&!visit[i][j]{
q=append(q,[]int{i,j})
visit[i][j]=true
area:=bfs()
if area>res{
res=area
}
}
}
}
return res
}
感悟
更新visit务必要放在坐标入队时,否则会出现重复入队的现象。