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)