1162. 地图分析
你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。
我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。
如果网格上只有陆地或者海洋,请返回 -1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
多源广度搜索
import java.util.*;
class Solution {
private int[] dx = {0, 1, 0, -1};
private int[] dy = {1, 0, -1, 0};
public int maxDistance(int[][] grid) {
if (grid == null || grid[0].length == 0) {
return 0;
}
int n = grid.length;
int m = grid[0].length;
Queue<Point> queue = new LinkedList<>();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == 1) {
queue.offer(new Point(i, j, 0));
}
}
}
int ans = -1;
while (!queue.isEmpty()) {
Point point = queue.poll();
for (int i = 0; i < 4; ++i) {
int x = point.x + dx[i];
int y = point.y + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 0) {
grid[x][y] = 1;
ans = Math.max(ans, point.step + 1);
queue.offer(new Point(x, y, point.step + 1));
}
}
}
return ans;
}
}
class Point {
int x;
int y;
int step;
public Point(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
}
}
多源最短路
动态规划
class Solution {
public int maxDistance(int[][] grid) {
final int INF = 1000000;
int n = grid.length;
int[][] f = new int[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
f[i][j] = grid[i][j] == 1 ? 0 : INF;
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) {
continue;
}
if (i - 1 >= 0) {
f[i][j] = Math.min(f[i][j], f[i - 1][j] + 1);
}
if (j - 1 >= 0) {
f[i][j] = Math.min(f[i][j], f[i][j - 1] + 1);
}
}
}
for (int i = n - 1; i >= 0; --i) {
for (int j = n - 1; j >= 0; --j) {
if (grid[i][j] == 1) {
continue;
}
if (i + 1 < n) {
f[i][j] = Math.min(f[i][j], f[i + 1][j] + 1);
}
if (j + 1 < n) {
f[i][j] = Math.min(f[i][j], f[i][j + 1] + 1);
}
}
}
int ans = -1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 0) {
ans = Math.max(ans, f[i][j]);
}
}
}
if (ans == INF) {
return -1;
} else {
return ans;
}
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号