一、题目描述
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。
整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。
格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
输入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边:
二、题解
方法一:dfs
默认情况下找到一个岛屿他对周长的贡献为 4,但岛屿的边会重叠,所以我们判断他的上下左右是否也是岛屿:
- 如果任意一个方向有岛屿,那么这个岛屿对边的贡献需要 -1.
int res = 0;
int m, n;
public int islandPerimeter(int[][] grid) {
m = grid.length;
n = grid[0].length;
for (int x = 0; x < m; x++)
for (int y = 0; y < n; y++) {
if (grid[x][y] == 1)
dfs(grid, x, y);
}
return res;
}
private void dfs(int[][] grid, int x, int y) {
//默认找到一个岛屿他对周长的贡献为 4
int edges = 4;
if (x - 1 >= 0 && grid[u][y] == 1) edges--;
if (x + 1 < m && grid[d][y] == 1) edges--;
if (y - 1 >= 0 && grid[x][l] == 1) edges--;
if (y + 1 < n && grid[x][r] == 1) edges--;
res += edges;
}
复杂度分析
- 时间复杂度: O ( m × n ) O(m × n) O(m×n),
- 空间复杂度: O ( m × n ) O(m × n) O(m×n),
进阶:如果岛屿中有湖,你该如果写算法?