Leetcode-463-岛屿的周长

Leetcode-463-岛屿的周长

题目描述

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

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

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

mark

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

思路: 迭代

  • 对于一个陆地格子的每条边,它被算作岛屿的周长当且仅当这条边为网格的边界或者相邻的另一个格子为水域。
  • 因此,我们可以遍历每个陆地格子,看其四个方向是否为边界或者水域,如果是,将这条边的贡献(即 1)加入答案ans 中即可。
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
class Solution {
static int[] dx = {0,1,0,-1};
static int[] dy = {1,0,-1,0};

public int islandPerimeter(int[][] grid) {
int n = grid.length; // 行
int m = grid[0].length; // 列

int ans = 0;

// 遍历每个陆地格子,看其四个方向是否是边界或者水域
// 如果是边界 或者 是水域 那么将这条边的贡献加1到ans中
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
// 遍历每一个陆地格子
if(grid[i][j] == 1){
// 遍历每个格子四条边4条边
int count = 0;
for(int k = 0;k < 4;k++){
int tx = i + dx[k];
int ty = j + dy[k];
if(tx < 0 || tx >= n || ty < 0 || ty >= m || grid[tx][ty] == 0){
count += 1;
}
}
// 计算完一个格子之后
ans += count;
}
}
}

return ans;
}
}

复杂度分析

  • 时间复杂度:O(nm),其中 n 为网格的高度,m 为网格的宽度。我们需要遍历每个格子,每个格子要看其周围 4 个格子是否为岛屿,因此总时间复杂度为 O(nm)。
  • 空间复杂度O(1)。只需要常数空间存放若干变量。
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信