題目描述
給定一個包含了一些 0 和 1 的非空二維數組 grid 。
一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。
找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/max-area-of-island
DFS解法
思路說明(摘自leetcode):
我們想知道網格中每個連通形狀的面積,然後取最大值。
如果我們在一個土地上,以 4 個方向探索與之相連的每一個土地(以及與這些土地相連的土地),那麼探索過的土地總數將是該連通形狀的面積。
爲了確保每個土地訪問不超過一次,我們每次經過一塊土地時,將這塊土地的值置爲 0。這樣我們就不會多次訪問同一土地。
python3實現
from typing import List
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
if not grid:
return 0
m,n = len(grid),len(grid[0])
res=0
for i in range(m):
for j in range(n):
if grid[i][j]==1:
stack=[(i,j)]
grid[i][j]=0
cnt=0
while stack:
node=stack[-1]
neibors=[(max(node[0]-1,0),node[1]),(min(node[0]+1,m-1),node[1]),(node[0],max(node[1]-1,0)),(node[0],min(node[1]+1,n-1))]
pop_flag=True
for neibor in neibors:
if grid[neibor[0]][neibor[1]]==1:
stack.append(neibor)
grid[neibor[0]][neibor[1]]=0
pop_flag=False
break
if pop_flag:
stack.pop()
cnt +=1
res=max(res,cnt)
return res
BFS解法
把DFS方法中的棧改爲隊列,每次從隊首取出土地,並將接下來想要遍歷的土地放在隊尾,就實現了廣度優先搜索算法。
python3實現
from typing import List
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
res=0
if not grid:
return res
m,n =len(grid),len(grid[0])
from collections import deque
for i in range(m):
for j in range(n):
if grid[i][j]==1:
q=deque([(i,j)])
grid[i][j]=0
cnt=0
while q:
node=q.popleft()
cnt+=1
neibors=[(max(node[0]-1,0),node[1]),(min(node[0]+1,m-1),node[1]),(node[0],max(node[1]-1,0)),(node[0],min(node[1]+1,n-1))]
for neibor in neibors:
if grid[neibor[0]][neibor[1]]==1:
q.append(neibor)
grid[neibor[0]][neibor[1]]=0
res=max(res,cnt)
return res