一、问题描述
给定一个包含了一些 0 和 1的非空二维数组 grid
, 一个 岛屿 是由四个方向 (水平或垂直) 的 1
(代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为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,因为岛屿只能包含水平或垂直的四个方向的‘1’。
示例 2:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0
。
注意: 给定的矩阵grid
的长度和宽度都不超过 50。
二、代码和思路
这里参考python数据结构与算法书中递归求解的方法,但感觉效果不太好,运行时间太长
1. self.dirs=[(0,1),(1,0),(0,-1),(-1,0)] 主要定义下一个位置的地方
2.def mark(self,grid,pos) 这里函数主要找到一个1就将他标记为2,防止循坏利用
3.possible(self,grid,pos):核心函数,这里递归遍历记录面积
class Solution(object):
def __init__(self):
self.dirs=[(0,1),(1,0),(0,-1),(-1,0)]
self.max_area=0
self.area=0
def mark(self,grid,pos):
grid[pos[0]][pos[1]]=2
def possible(self,grid,pos):
m,n=len(grid),len(grid[0])
if pos[0]>=0 and pos[0]<m and pos[1]>=0 and pos[1]<n:
return grid[pos[0]][pos[1]]==1
else:
return False
def find_area(self,grid,pos):
if self.possible(grid,pos):
self.mark(grid,pos)
self.area += 1
for k in range(4):
nextp=[pos[0]+self.dirs[k][0],pos[1]+self.dirs[k][1]]
self.find_area(grid,nextp)
def maxAreaOfIsland(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m,n=len(grid),len(grid[0])
for i in range(m):
for j in range(n):
self.area=0
self.find_area(grid,[i,j])
if self.area>self.max_area:
self.max_area=self.area
return self.max_area
三、运行结果(效果很差,可以试下栈和队列的方法)