岛屿的周长

标签: 深度优先搜索 广度优先搜索 数组 矩阵

难度: Easy

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

 

示例 1:

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

示例 2:

输入:grid = [[1]]
输出:4

示例 3:

输入:grid = [[1,0]]
输出:4

 

提示:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 100
  • grid[i][j]01

Submission

运行时间: 53 ms

内存: 16.4 MB

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        length=len(grid)
        width=len(grid[0]) 
        c=0
        for i in range(length):
            for j in range(width):
                if grid[i][j]==1:
                    if i==0 or grid[i-1][j]==0:
                        c+=1
                    if j==0 or grid[i][j-1]==0:
                        c+=1
        return 2*c

Explain

这个题解的思路是遍历二维网格,对于每个陆地格子,检查其上方和左方是否为水域或者超出网格边界。如果是,就给周长加1。最后将统计到的周长乘以2返回,因为只统计了岛屿周长的一半(上方和左方)。

时间复杂度: O(m*n)

空间复杂度: O(1)

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        length = len(grid)
        width = len(grid[0])
        c = 0
        for i in range(length):
            for j in range(width):
                # 如果当前格子是陆地
                if grid[i][j] == 1:
                    # 检查上方格子是否为水域或超出边界
                    if i == 0 or grid[i-1][j] == 0:
                        c += 1
                    # 检查左方格子是否为水域或超出边界
                    if j == 0 or grid[i][j-1] == 0:
                        c += 1
        # 周长乘以2返回,因为只统计了一半
        return 2 * c

Explore

此方法是一种优化策略,避免重复计算相邻格子间的共享边界。通过仅检查每个陆地格子的上方和左方,每条边界自然只被检查一次。若检查四个方向,每条边界将被检查两次(一次由每个相邻的格子各计算一次),因此,选择上方和左方是减少计算和避免重复的一种方式。

因为算法只统计了每个陆地格子的上方和左方边界,所以每条边界实际只计算了一半。为了得到完整的周长,需要将统计到的结果乘以2。这种方法能准确覆盖所有边界情况,因为它确保了网格中的每条陆地边界都被恰好计算了一次。

如果一个陆地格子位于网格的角落,例如左上角,其两个边界(上方和左方)都是网格边界。因此,这两个边界会被算入周长中,每个边界贡献1,总共贡献2。乘以2的计算规则后,这个角落格子对周长的贡献为4。

此算法可以正确处理网格中存在一个或多个岛屿的情况。算法通过遍历每个格子并且独立地计算每个陆地格子对应的周长贡献,不依赖于岛屿的数量或位置。因此,无论网格中有一个岛屿还是多个岛屿,算法都能准确计算出总周长。