返回

解码力扣463:直面岛屿,精准计算周长

前端

在算法领域的浩瀚征途上,力扣题库宛若一座巍峨的高峰,而463. 岛屿的周长题则是其中一颗闪烁着智慧光泽的明珠。这道题考验着算法工程师对计算机图形学和几何计算的掌握程度,需要我们巧妙地周旋于数据海洋中,精准地测量岛屿的周长。

面对这道算法难题,我们不妨跳出固有的思维定势,以独到的视角审视它。当我们把目光投向岛屿的边缘时,会发现周长的计算其实可以归结为统计岛屿边界上单元格的数量。

算法策略:深度优先搜索(DFS)

为了高效地遍历岛屿的边缘,我们采用深度优先搜索(DFS)算法。DFS以递归的方式深入岛屿的内部,每走一步就标记单元格为已访问,并统计边界的单元格数量。

算法步骤:

  1. 初始化变量perimeter为0,表示周长。
  2. 遍历二维网格grid,寻找起始岛屿单元格(值为1)。
  3. 对每个起始岛屿单元格,调用DFS函数dfs(grid, i, j)
  4. 在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分别为网格的行数和列数。因为每个单元格最多被访问一次,所以算法的总运行时间取决于网格的大小。

拓展:

该算法还可以扩展到其他类似的问题中,例如计算图像中连通分量的边界长度或计算多边形的周长。