深度/廣度優先搜索
#1 深度優先搜索(DFS)
Depth-First-Search
步驟 : 不到盡頭不回頭
- 從 1 開始,先找到其中一個相連的,2 被找到了
- 然後直接開始從 2 開始搜索,3 被找到了
- 然後從 3 開始搜索,4 被找到了
- 然後從 4 開始搜索,5 被找到了
- 然後從 5 開始搜索,忽略已經找到的所以啥都沒找到
- 然後沒路可走了,回到前面去再走另一條路
- 從 4 開始,6 被找到了,然後又沒路可走了
- 然後再回去前面 4,然後沒路了
- 回去前面 3,然後一直這樣
1-2-3-4-5-6
#2 廣度優先搜索(BFS)
Breadth-First-Search
步驟 :
- 從 1 開始進行搜索的話
- 先搜索所有和 1 相連的,也就是 2 和 5 被找到了
- 然後再從 2 開始搜索和他相連的,也就是 3 被找到了
- 然後從 5 搜,也就是 4 被找到了
- 然後從 3 開始搜索,4 被找到了,但是 4 之前已經被 5 找到了,所以忽略掉就行
- 然後 3 開始搜索,忽略 4 所以啥都沒搜到,然後從 4 開始,6 被找到了
1-2-5-3-4-6
#3 算法題
#3.1 島嶼的最大面積
LeetCode :
https://leetcode-cn.com/problems/max-area-of-island/
題目 :
給定一個包含了一些 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。
題目解讀 :
- 每個元素,只能關聯東南西北四個方向
- 在所給的二維矩陣中,找到由"1"相連的數量最多
思路 :
- 首先遍歷每一個元素爲 “1” 的點, 記爲a
- 然後根據點a, 東南西北四個方向, 找到爲 “1” 的點
- 遞歸a附近四個方向點, 的四個方向 (深度優先搜索)
代碼 :
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
ret = 0 # 最大面積
for row, x in enumerate(grid):
for col, y in enumerate(x):
if grid[row][col] != 0: # 只有當元素爲 "1" 時, 才使用深度優先搜索
ret = max(ret, self.dfs(grid,row,col)) # 每次DFS後, 與之前的最大面積相比, 取最大值
return ret
def dfs(self, grid, x, y): # 深度優先遍歷
if x<0 or y<0 or x>=len(grid) or y>=len(grid[0]): # 越界 -> 返回 0
return 0
if grid[x][y] == 0: # 不是陸地 -> 返回 0
return 0
grid[x][y] = 0 # 被查詢過得點, 標記 0
return self.dfs(grid,x,y+1) + self.dfs(grid,x,y-1) + self.dfs(grid,x+1,y) + self.dfs(grid,x-1,y) + 1 # (x,y)的四個方向 (x,y+1) (x,y-1) (x+1,y) (x-1,y), 每個方向調用DFS