返回
从算法分析 算法题 Leetcode 200--岛屿数量--python
人工智能
2024-01-25 12:39:59
在算法的世界中,Leetcode 200--岛屿数量是一个经典的问题。它要求你计算一个由0和1组成的二维数组中,有多少个岛屿。一个岛屿被定义为由相邻的1组成的连通区域。
为了解决这个问题,我们可以使用深度优先搜索(DFS)算法。DFS是一种递归算法,它从某个节点出发,然后依次访问该节点的所有相邻节点。如果相邻节点的值为1,并且没有被访问过,那么就将其作为新的起始节点,继续进行DFS。当所有相邻节点都被访问过之后,就返回到上一个节点,继续访问该节点的下一个相邻节点。以此类推,直到所有的节点都被访问过。
在DFS的过程中,我们需要使用一个visited数组来记录哪些节点已经被访问过。这样可以防止我们重复访问同一个节点,从而提高算法的效率。
下面是使用python实现Leetcode 200--岛屿数量算法的代码:
def num_islands(grid):
"""
计算一个由0和1组成的二维数组中,有多少个岛屿。
参数:
grid:一个由0和1组成的二维数组
返回值:
岛屿的数量
"""
# 创建一个visited数组来记录哪些节点已经被访问过
visited = [[False for _ in range(len(grid[0]))] for _ in range(len(grid))]
# 初始化岛屿数量为0
num_islands = 0
# 遍历二维数组中的每个节点
for i in range(len(grid)):
for j in range(len(grid[0])):
# 如果该节点的值为1,并且没有被访问过,那么就将其作为新的起始节点,开始DFS
if grid[i][j] == 1 and not visited[i][j]:
# 调用DFS函数,并将该节点的坐标作为参数传递给它
dfs(grid, visited, i, j)
# DFS函数返回后,岛屿数量加1
num_islands += 1
# 返回岛屿的数量
return num_islands
def dfs(grid, visited, i, j):
"""
深度优先搜索算法
参数:
grid:一个由0和1组成的二维数组
visited:一个visited数组,记录哪些节点已经被访问过
i:当前节点的行号
j:当前节点的列号
"""
# 标记当前节点为已访问过
visited[i][j] = True
# 访问当前节点的相邻节点
# 上
if i > 0 and grid[i - 1][j] == 1 and not visited[i - 1][j]:
dfs(grid, visited, i - 1, j)
# 下
if i < len(grid) - 1 and grid[i + 1][j] == 1 and not visited[i + 1][j]:
dfs(grid, visited, i + 1, j)
# 左
if j > 0 and grid[i][j - 1] == 1 and not visited[i][j - 1]:
dfs(grid, visited, i, j - 1)
# 右
if j < len(grid[0]) - 1 and grid[i][j + 1] == 1 and not visited[i][j + 1]:
dfs(grid, visited, i, j + 1)
这个算法的时间复杂度为O(mn),其中m和n分别是二维数组的行数和列数。空间复杂度为O(mn),因为我们需要创建一个visited数组来记录哪些节点已经被访问过。