463. 岛屿的周长
给定一个包含 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)的时候,判断它的上下左右,是否是边界,如果是边界就加上周长的值;
2.第二种方法,这种方法相对会巧妙一点。只是是岛屿,我就加4,然后,判断它左侧,和上测是否是岛屿,如果是,分别减去2,因为两个岛屿之间的重叠,要翻倍边长;
3.从效率上来说,应该差不了太多。但是代码量,第二种更简洁一些。
代码实现:
方法1:
class Solution(object):
def islandPerimeter(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
perimeter = 0
for x in range(len(grid)):
for y in range(len(grid[0])):
if grid[x][y]==1:
perimeter += self.perimeter(grid, x, y)
return perimeter
def perimeter(self, grid, x, y):
res = 0
if x-1<0 or grid[x-1][y] == 0:
res += 1
if x+1>=len(grid) or grid[x+1][y] == 0:
res += 1
if y-1<0 or grid[x][y-1]==0:
res += 1
if y+1>=len(grid[0]) or grid[x][y+1] == 0:
res += 1
return res
方法2:
class Solution(object):
def islandPerimeter(self, grid):
perimeter=0
for x in range(len(grid)):
for y in range(len(grid[0])):
if grid[x][y]==0:
continue
perimeter += 4
if x>0:
if grid[x-1][y]==1:
perimeter -= 2
if y>0:
if grid[x][y-1]==1:
perimeter -= 2
return perimeter