题目描述
很显然,这题是一个很经典的深广度优先问题,在这里我们主要讲广度优先,因为在Python中,在利用栈–深度优先,队列–广度优先的时候,其实原理是差不多的,只是**pop()**的位置不一样。
解题思路
什么叫广度优先搜索,就是以一个节点为初始节点,将此节点所能遍历的位置都遍历一遍,可以类比树的层次遍历。
具体怎么做呢,直接甩代码,因为这是这类问题解决的模板,只要认真思考,掌握了,下次就可以直接写了。
def maxAreaOfIsland(grid):
#获取该岛屿的行列数
m, n = len(grid), len(grid[0])
max_area = 0
queue = []
#BFS
for i in range(m):
for j in range(n):
# BFS
if grid[i][j] == 1:
area_count = 0
queue.append((i, j))
#同样也要标记
grid[i][j] = 0
#队列不为空就一直pop()
while queue:
x, y = queue.pop(0)
area_count += 1
# 广度优先搜索,向四个方向搜索,看是否存在 ==1 的点
for si, sj in ((x - 1, y), (x + 1, y), (x, y + 1), (x, y - 1)):
if 0 <= si < m and 0 <= sj < n and grid[si][sj] == 1:
queue.append((si, sj))
#标记走过的岛屿
grid[si][sj] = 0
max_area = max(max_area, area_count)
return max_area
print(maxAreaOfIsland([[1,1,0,0,0],[1,1,0,0,0],[0,0,0,1,1],[0,0,0,1,1]]))
最后结果输出的‘4’ ,对着代码一步步走,
首先先对该列表进行循环,当遇见grid[i][j] == 1 的时候,说明发现了新岛屿,对此岛屿进行广度优先搜索,每pop一个节点,就让area_count += 1,很重要的一点,当你搜索到一个为1的岛屿时,必须将其标记为已经走过的,也就是 grid[si][sj] = 0 (你也可以标记其他的,-1什么的都可以,),不然遍历的时候,就会重复计算。
后面也没什么了,每发现一个新岛屿就拿他的面积与 max_area做比较。取最大值,返回max_area。
总结
栈-深度优先搜索其实就是pop最后一个 ,代码形式差不多,有兴趣的小伙伴可以自己去写一写。在迷宫问题,岛屿问题,还有其他的问题中,深广度优先搜索都是很重要的知识,如果是刚接触的小伙伴可能会感觉有点难,多写多画就行了,慢慢的就很容易掌握了。