返回
解码力扣463:直面岛屿,精准计算周长
前端
2023-10-17 13:53:49
在算法领域的浩瀚征途上,力扣题库宛若一座巍峨的高峰,而463. 岛屿的周长题则是其中一颗闪烁着智慧光泽的明珠。这道题考验着算法工程师对计算机图形学和几何计算的掌握程度,需要我们巧妙地周旋于数据海洋中,精准地测量岛屿的周长。
面对这道算法难题,我们不妨跳出固有的思维定势,以独到的视角审视它。当我们把目光投向岛屿的边缘时,会发现周长的计算其实可以归结为统计岛屿边界上单元格的数量。
算法策略:深度优先搜索(DFS)
为了高效地遍历岛屿的边缘,我们采用深度优先搜索(DFS)算法。DFS以递归的方式深入岛屿的内部,每走一步就标记单元格为已访问,并统计边界的单元格数量。
算法步骤:
- 初始化变量
perimeter
为0,表示周长。 - 遍历二维网格
grid
,寻找起始岛屿单元格(值为1)。 - 对每个起始岛屿单元格,调用DFS函数
dfs(grid, i, j)
。 - 在DFS函数中:
- 标记单元格
(i, j)
为已访问。 - 判断单元格
(i, j)
的上下左右是否有未访问的岛屿单元格。 - 如果有未访问的单元格,递归调用DFS函数。
- 如果没有未访问的单元格,则
perimeter
加1。
- 标记单元格
代码实现:
def island_perimeter(grid):
"""
计算给定网格中岛屿的周长。
Args:
grid (list[list[int]]): 二维网格,0表示水域,1表示岛屿。
Returns:
int: 岛屿的周长。
"""
def dfs(grid, i, j):
"""
深度优先搜索函数,遍历岛屿并统计边界单元格数量。
Args:
grid (list[list[int]]): 二维网格。
i (int): 行索引。
j (int): 列索引。
"""
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0:
return 1
if grid[i][j] == 2:
return 0
grid[i][j] = 2 # 标记单元格为已访问
return dfs(grid, i - 1, j) + dfs(grid, i + 1, j) + dfs(grid, i, j - 1) + dfs(grid, i, j + 1)
perimeter = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1:
perimeter += dfs(grid, i, j)
return perimeter
分析:
该算法的时间复杂度为O(m×n),其中m和n分别为网格的行数和列数。因为每个单元格最多被访问一次,所以算法的总运行时间取决于网格的大小。
拓展:
该算法还可以扩展到其他类似的问题中,例如计算图像中连通分量的边界长度或计算多边形的周长。