Skip to content

面试题 16.19. 水域大小


题目链接

https://leetcode.cn/problems/pond-sizes-lcci/

注意事项

池塘的定义是:上下、左右、对角线上相邻都是 0 的元素,即需要搜索 8 个方向,在原方向数组的基础上扩展即可

代码实现

java
class Solution {
    // 搜索八个方向
    public static int[][] dir = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 },
            { -1, 1 }, { 1, -1 }, { 1, 1 }, { -1, -1 } };

    public int[] pondSizes(int[][] land) {
        int n = land.length;
        int m = land[0].length;
        boolean[][] visited = new boolean[n][m];

        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!visited[i][j] && land[i][j] == 0) {
                    list.add(dfs(land, i, j, visited));
                }
            }
        }

        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }

        Arrays.sort(res);

        return res;
    }

    public int dfs(int[][] grid, int x, int y, boolean[][] visited) {
        int count = 1;
        visited[x][y] = true;

        for (int i = 0; i < dir.length; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];

            // 检查越界
            if (nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length) {
                continue;
            }

            if (!visited[nextX][nextY] && grid[nextX][nextY] == 0) {
                count += dfs(grid, nextX, nextY, visited);
            }
        }
        return count;
    }
}