Directorio de artículos
La búsqueda primero en profundidad (DFS) y la búsqueda primero en amplitud (BFS) son problemas de algoritmos relativamente difíciles, pero también son preguntas comunes en las entrevistas, por lo que deben estudiarse y dominarse cuidadosamente.
DFS se implementa con recursividad y BFS se implementa con pilas
1. Problemas de la isla (conectividad de la isla)
1.1 Número de islas
Enlace a LeetCode: LeetCode 200. Número de islas
tema:
Dada una cuadrícula 2D que consta de '1' (tierra) y '0' (agua), cuente el número de islas en la cuadrícula.
Las islas siempre están rodeadas de agua, y cada isla solo se puede formar conectando tierra adyacente horizontal y/o verticalmente.
Además, puede suponer que la malla está rodeada de agua por los cuatro costados.
Ejemplo 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
Ejemplo 2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
1.1.1 Solución DFS
código:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
# dfs 用递归实现
def dfs(i,j):
if not 0<=i<len(grid) or not 0<=j<len(grid[0]) or grid[i][j]!="1":
return
# 遍历完(i,j)后将其标记为水,防止重复搜索
grid[i][j]="0"
vectors=([i,j+1],[i-1,j],[i,j-1],[i+1,j])
for vector in vectors:
dfs(vector[0],vector[1])
num=0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]=="1":
dfs(i,j)
num+=1
return num
1.1.2 Solución BFS
El código para escribir BFS como una función:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
# 通过bfs将搜索过的节点标记为“0”
# bfs通过栈实现(先进先出)
def bfs(i,j):
if not 0<=i<len(grid) or not 0<=j<len(grid[0]) or grid[i][j]!="1":
return
stack.append([i,j])
grid[i][j]="0"
while stack:
stack.pop(0)
vectors=([i,j+1],[i-1,j],[i,j-1],[i+1,j])
for vector in vectors:
bfs(vector[0],vector[1])
num=0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]=="1":
stack=[]
bfs(i,j)
num+=1
return num
Notación BFS usando iteraciones en lugar de funciones:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
num=0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]=="1":
# bfs通过栈实现(先进先出)
# deque 是双向队列,可以高效的在队列头部和尾部添加、删除元素
deque=collections.deque([[i,j]])
grid[i][j]="0" # 将搜索过的节点标记为“0”
while deque:
row,col=deque.popleft()
vectors=([row,col+1],[row-1,col],[row,col-1],[row+1,col])
for vector in vectors:
if 0<=vector[0]<len(grid) and 0<=vector[1]<len(grid[0]) and grid[vector[0]][vector[1]]=="1":
deque.append(vector)
grid[vector[0]][vector[1]]="0" # 将搜索过的节点标记为“0”
num+=1
return num
Nota:
Cuando se usa la pila de primero en entrar, primero en salir, se debe usar collections.deque() en preferencia a la lista