声明:
今天是第108道题。给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 :
输入: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] 输出: 16 解释: 它的周长是下面图片中的 16 个黄色的边:
解法1。其实题目的图已经给了提示了,对于每个黄色小格,如果它上下左右有相邻的黄色格子的话,重合边就+1,那么周长就-1,遍历每个黄色格子,有相邻的就-1,代码如下。
执行用时: 200 ms, 在Island Perimeter的Python提交中击败了82.77% 的用户
class Solution(object):
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
cube = 0 # 计算黄色格子的个数
cut_edge = 0 # 计算需要减去的周长
m = len(grid[0]) # 横向,长
n = len(grid) # 纵向,宽
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
cube += 1
if i-1 >= 0: # 上
cut_edge += grid[i-1][j]
if i+1 < n: # 下,注意这里i+1不能等于n
cut_edge += grid[i+1][j]
if j-1 >= 0: # 左
cut_edge += grid[i][j-1]
if j+1 < m: # 右
cut_edge += grid[i][j+1]
return 4*cube - cut_edge
解法2。进一步简化逻辑,其实对每个黄色小格子只需计算它的上面和左边有没有格子,有的话周长-2,这样遍历的时候每条重复的边都会被计算到,并且不用考虑后面和下面的格子,代码如下。
执行用时: 180 ms, 在Island Perimeter的Python提交中击败了93.63% 的用户
class Solution(object):
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
perimeter = 0
m = len(grid[0])
n = len(grid)
for i in range(n):
for j in range(m):
if grid[i][j] == 1:
perimeter += 4
if i-1 >= 0 and grid[i-1][j] == 1:
perimeter -= 2
if j-1 >= 0 and grid[i][j-1] == 1:
perimeter -= 2
return perimeter
结尾
解法1:https://blog.csdn.net/weixin_40449300/article/details/80993502
解法2:LeetCode