你现在手里有一份大小为 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;}}
