# 463. Island Perimeter

**<font color=red>难度: Easy</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/island-perimeter/description/

> 内容描述

```
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). The island doesn't have "lakes" (water inside that isn't connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don't exceed 100. Determine the perimeter of the island.

Example:

[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

Answer: 16
Explanation: The perimeter is the 16 yellow stripes in the image below:
```
![](https://github.com/apachecn/LeetCode/blob/master/images/463/island.png)
## 解题方案

> 思路 1
******- 时间复杂度: O(N^2)******- 空间复杂度: O(1)******

最粗暴的方式，如果两个单元格都是陆地且相邻，那么对于这个单元格来说它的周长就要被消去1了

```python
class Solution:
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        res = 0
        row = len(grid)
        col = len(grid[0]) if row else 0
        for i in range(row):
            for j in range(col):
                if grid[i][j] == 1:
                    res += 4
                    if i - 1 >= 0 and grid[i-1][j] == 1:
                        res -= 1
                    if j - 1 >= 0 and grid[i][j-1] == 1:
                        res -= 1
                    if i + 1 < row and grid[i+1][j] == 1:
                        res -= 1
                    if j + 1 < col and grid[i][j+1] == 1:
                        res -= 1
        return res
```

可以写的更精简一点，我们对于每一个单元格只需要看它的左边和上边，然后碰到相邻周长一下子消去2就可以了

```python
class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        h = len(grid)
        w = len(grid[0]) if h else 0
        res = 0
        # 每一个陆地单元格的周长为4，当两单元格上下或者左右相邻时，令周长减2
        for i in range(h):
            for j in range(w):
                if grid[i][j] == 1:
                    res += 4
                    # 因为x+1还在后面，所以不需要考虑，即只需要考虑左边和上边，因为循环已经出现过该点了
                    if i > 0 and grid[i-1][j]:
                        res -= 2
                    if j > 0 and grid[i][j-1]:
                        res -= 2
        return res
```
