典型的回溯法题目。与棋盘问题类似。
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
def dfs(i,j):
if not(0<=i<m) or not(0<=j<n):
return 0
if visited[i][j]==1:
return 0
if grid[i][j]=='0':
return 0
visited[i][j]=1
dfs(i-1,j)
dfs(i,j-1)
dfs(i+1,j)
dfs(i,j+1)
return 1
if grid==[] or grid==[[]]:
return 0
m=len(grid)#m行
n=len(grid[0])#n列
visited=[[0 for i in range(n)] for j in range(m)]
result=0
for i in range(m):
for j in range(n):
result+=dfs(i,j)
return result
最快的code:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
def dfs(grid,i,j):
grid[i][j] = '#'
if i - 1 >= 0 and grid[i-1][j] == '1':
dfs(grid,i-1,j)
if j + 1 < len(grid[0]) and grid[i][j+1] == '1':
dfs(grid,i,j+1)
if i + 1 < len(grid) and grid[i+1][j] == '1':
dfs(grid,i+1,j)
if j - 1 >= 0 and grid[i][j-1] == '1':
dfs(grid,i,j-1)
return
res = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
res += 1
dfs(grid,i,j)
return res