Post

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.