题目描述
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖”指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
样例
输入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
输出:16
解释:它的周长是下面图片中的 16 个黄色的边:
算法
(模拟) $O(n^2)$
- 枚举每个格子,如果格子为陆地,将其周围水格子的个数累加到答案。
时间复杂度
- 枚举每个格子,总时间复杂度为 $O(n^2)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int islandPerimeter(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size(), ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (grid[i][j] == 1) {
int tot = 4;
for (int d = 0; d < 4; d++) {
int tx = i + dx[d], ty = j + dy[d];
if (tx < 0 || tx >= n || ty < 0 || ty >= m)
continue;
if (grid[tx][ty] == 1)
tot--;
}
ans += tot;
}
return ans;
}
};