Lc.463 岛屿周长
Lc.463 岛屿周长
看这题前先看
lc.200 岛屿数量
题解
—
—
```java
class Solution {
// 计算周长的递归方法
int travel(int[][] grid, int x, int y) {
if (notInArea(grid, x, y)) {
return 1; // 越界,贡献1个周长
}
if (grid[x][y] == 0) {
return 1; // 是水域,贡献1个周长
}
if (grid[x][y] == 2) {
return 0; // 已访问,不贡献周长
}
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
grid[x][y] = 2; // 标记为已访问
int perimeter = 0;
// 检查四个方向
perimeter += travel(grid, x+1, y);
perimeter += travel(grid, x-1, y);
perimeter += travel(grid, x, y+1);
perimeter += travel(grid, x, y-1);
return perimeter;
}
boolean notInArea(int[][] grid, int x, int y) {
return x < 0 || x >= grid.length || y < 0 || y >= grid[0].length;
}
public int islandPerimeter(int[][] grid) {
int result = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) { // 找到陆地
return travel(grid, i, j); // 题目规定只有一个岛,找到后直接返回
}
}
}
return result;
} } ```
有漏洞的实现(贴出来用做对比查漏)
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
37
38
39
40
41
42
43
44
45
46
47
48
class Solution {
int travel(char[][] grid, int x, int y, int result) {
if (notInArea(grid, x, y)) {
return 0;
}
if (grid[x][y] == '0' || grid[x][y] == '2') {
return 0;
}
grid[x][y] = '2';
if (grid[x+1][y] != 2) {
result += 1;
}
if (grid[x][y+1] != 2) {
result += 1;
}
if (grid[x-1][y] != 2) {
result += 1;
}
if (grid[x][y-1] != 2) {
result += 1;
}
result += travel(grid, x+1, y, result);
result += travel(grid, x, y+1, result);
result += travel(grid, x-1, y, result);
result += travel(grid, x, y-1, result);
return result;
}
boolean notInArea(char[][] grid, int x, int y) {
return x < 0 || x >= grid.length || y < 0 || y >= grid[0].length;
}
public int islandPerimeter(int[][] grid) {
int result = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
result += travel(grid, i, j, result);
}
}
}
return result;
}
}
This post is licensed under CC BY 4.0 by the author.