Keshawn_lu's Blog

Leetcode 463. 岛屿的周长

字数统计: 402阅读时长: 1 min
2020/11/03 Share

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。

网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 :

1
2
3
4
5
6
7
8
9
输入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]

输出: 16

解释: 它的周长是下面图片中的 16 个黄色的边:

思路:

每个陆地能贡献出的周长取决于周围格子是否为以下两种状态:

  • 四周的格子超过边界。
  • 四周的格子为水域。

所以我们遍历整个数组,记录每个陆地所能贡献出的周长,累加即可。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:

int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};

int islandPerimeter(vector<vector<int>>& grid) {

int res = 0;

for(int i = 0; i < grid.size(); i++){

for(int j = 0; j < grid[i].size(); j++){

if(grid[i][j]){ //陆地

int cnt = 0;

for(int k = 0; k < 4; k++){

int x = j + dx[k];
int y = i + dy[k];

if(x < 0 || x >= grid[i].size() || y < 0 || y >= grid.size() || !grid[y][x])
cnt++;
}

res += cnt; //该陆地贡献的周长
}

}
}

return res;
}
};
CATALOG
  1. 1. 思路:
  2. 2. 代码如下: