Leedcode-岛屿的周长

自己写的:

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        # 初始化周长计数器
        count = 0

        # 遍历二维网格的行
        for i in range(len(grid)):
            # 遍历二维网格的列
            for j in range(len(grid[i])):
                # 如果当前位置有陆地(值为1)
                if grid[i][j] == 1:
                    # 增加周长计数器4,因为陆地的四周都有边界
                    count += 4
                    # 检查上方是否有陆地,若有则减去一条边
                    if i - 1 >= 0 and grid[i - 1][j] == 1:
                        count -= 1
                    # 检查下方是否有陆地,若有则减去一条边
                    if i + 1 <= len(grid) - 1 and grid[i + 1][j] == 1:
                        count -= 1
                    # 检查左侧是否有陆地,若有则减去一条边
                    if j - 1 >= 0 and grid[i][j - 1] == 1:
                        count -= 1
                    # 检查右侧是否有陆地,若有则减去一条边
                    if j + 1 <= len(grid[0]) - 1 and grid[i][j + 1] == 1:
                        count -= 1
        # 返回最终周长计数
        return count

 使用DFS算法:

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        # 遍历整个二维网格
        for r in range(len(grid)):
            for c in range(len(grid[0])):
                if grid[r][c] == 1:  # 如果当前单元格是陆地
                    # 题目限制只有一个岛屿,计算一个即可
                    return self.dfs(grid, r, c)
        return 0

    def dfs(self, grid, r, c):
        # 判断当前位置是否在网格范围内
        if not (0 <= r < len(grid) and 0 <= c < len(grid[0])):
            return 1
        if grid[r][c] == 0:  # 如果当前位置是水域
            return 1
        if grid[r][c] == 2:  # 如果当前位置已经被访问过
            return 0
        grid[r][c] = 2  # 标记当前位置为已访问
        # 递归地计算当前位置周围的陆地单元格
        return self.dfs(grid, r - 1, c) + self.dfs(grid, r + 1, c) + self.dfs(grid, r, c - 1) + self.dfs(grid, r, c + 1)

 

posted @ 2024-05-10 13:34  Junior_bond  阅读(1)  评论(0编辑  收藏  举报