面试题 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;
}
}