在本题中,海洋与陆地的距离可以等效为对陆地节点进行广度优先搜索,直到遇到海洋节点前所搜索的层数。
找出上述规律后,可用典型的队列实现对陆地节点的BFS了。不过这里有几点需要注意:
- 搜索的第一层应当是所有陆地节点,即对所有陆地节点同时展开搜索,这样最后一个被放入队列的节点就是距离陆地最远的海洋节点;
- 队列中存放的是海洋节点的坐标;
- 定义一个dir数组来简化对一个陆地节点的搜索;
- 将海洋节点放入队列前,将其数值改为2,这样海洋节点不会被重复放入队列。
class Solution {
int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
public int maxDistance(int[][] grid) {
int n = grid.length;
Queue<int[]> q = new LinkedList<>();
for(int i=0; i<n;i++){
for(int j=0; j<n; j++){
if(grid[i][j] == 1)q.offer(new int[]{i, j});
}
}
if(q.size()==0 || q.size() == n*n){
return -1;
}
int res=-1;
while(!q.isEmpty()){
res++;
int len = q.size();
for(int i=0; i<len; i++){
int[] e = q.poll();
int x = e[0];
int y = e[1];
for(int j=0; j<4; j++){
int newX = x + dir[j][0];
int newY = y + dir[j][1];
if(newX>=0 && newX <n && newY >=0 && newY <n && grid[newX][newY]==0){
grid[newX][newY] = 2;
q.offer(new int[]{newX, newY});
}
}
}
}
return res;
}
}