BFS方法,每次发现为‘1’的岛屿才搜索,且只要搜到连通域就将其置‘0’:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
len_i = len(grid)
if len_i == 0:
return 0
len_j = len(grid[0])
numLands = 0
from collections import deque
for m in range(len_i): #以这种方式对每个位置搜索
for n in range(len_j):
if grid[m][n] == '1':
numLands += 1
stack = deque([[m, n]])
grid[m][n] = '0'
while stack:
i, j = stack.popleft()
if i + 1 < len_i and grid[i + 1][j] == '1':
stack.append([i + 1, j])
grid[i + 1][j] = '0' #搜索到就置0
if i - 1 >= 0 and grid[i - 1][j] == '1':
stack.append([i - 1, j])
grid[i - 1][j] = '0'
if j + 1 < len_j and grid[i][j + 1] == '1':
stack.append([i, j + 1])
grid[i][j + 1] = '0'
if j - 1 >= 0 and grid[i][j - 1] == '1':
stack.append([i, j - 1])
grid[i][j - 1] = '0'
return numLands
dfs解法:
from collections import deque
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
def __dfs(grid, len_i, len_j, pos):
i, j = pos[0], pos[1]
directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
for di, dj in directions:
if 0 <= (i + di) < len_i and 0 <= (j + dj) < len_j and grid[i + di][j + dj] == '1':
grid[i + di][j + dj] = '0'
__dfs(grid, len_i, len_j, [i + di, j + dj])
len_i = len(grid)
if len_i == 0:
return 0
len_j = len(grid[0])
numLands = 0
for m in range(len_i):
for n in range(len_j):
if grid[m][n] == '1':
numLands += 1
grid[m][n] = '0'
__dfs(grid, len_i, len_j, (m, n))
return numLands