你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。如果网格上只有陆地或者海洋,请返回 -1。
我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。
示例 1:
输入:grid = [[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释:
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。
示例 2:
输入:grid = [[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释:
海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。
提示:
n == grid.length
n == grid[i].length
1 <= n <= 100
grid[i][j] 不是 0 就是 1
class Solution {
static private int[] dx = {-1,0,1,0}, dy = {0,1,0,-1};
public int maxDistance(int[][] grid) {
int n = grid.length;
//dist记录步数
int[][] dist = new int[n][n];
//初始化可以起到判重 保证每个点只入队一次
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) dist[i][j] = -1;
Deque<int[]> q = new ArrayDeque<>();
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) {
q.addLast(new int[]{i,j});
dist[i][j] = 0;
}
}
//全是陆地或者海洋直接返回
if (q.size() == n*n || q.size() == 0) return -1;
int res = 0;
while (!q.isEmpty()) {
int[] t = q.pollFirst();
for (int i = 0; i < 4; ++i) {
int a = dx[i] + t[0], b = dy[i] + t[1];
if (a < 0 || a >= n || b < 0 || b >= n) continue;
if (dist[a][b] != -1) continue;
dist[a][b] = dist[t[0]][t[1]] + 1;
q.addLast(new int[]{a,b});
//更新
res = Math.max(res,dist[a][b]);
}
}
return res;
}
}
class Solution {
static int[] dirs = new int[]{-1, 0, 1, 0, -1};
public int maxDistance(int[][] grid) {
int n = grid.length, m = grid[0].length;
Deque<int[]> q = new LinkedList<>();
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (grid[i][j] == 1) q.addLast(new int[]{i, j});
//全是陆地,或者海洋
if (q.size() == n * m || q.size() == 0) return -1;
while (!q.isEmpty()) {
int[] t = q.pollFirst();
for (int i = 0; i < 4; ++i) {
int x = t[0] + dirs[i], y = t[1] + dirs[i + 1];
if (x < 0 || x >= n || y < 0 || y >= m) continue;
if (grid[x][y] != 0) continue;
grid[x][y] = grid[t[0]][t[1]] + 1;
q.addLast(new int[]{x, y});
}
}
int res = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
res = Math.max(res, grid[i][j]);
return res - 1;
}
}