Leetcode-695.最大島嶼面積(DFS 與 BFS 解法,python3)

題目描述

給定一個包含了一些 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章