0代表海洋,1代表陆地。题目要求是找到每个海洋的距离最近的陆地的距离,并且选出其中的最大值。正常思路是从每个0出发,去找陆地,然后计算距离,最终选出满足条件的的数即可。但是肯定会超时。
采用BFS,是从1出发去找0,找到0之后就把当前位置变为1。
用一个队列存储所有1的位置,然后依次弹出,处理每个为1的点,就是向四个方向分析。然后把四个方向的点更新后再添加到队列中,参与弹出和处理。这样就保证了一步一步走,满足BFS的特性。
其实我也有点没想明白,这里会不会存在某一个点先到某一个0位置,并更新了该位置的值,而远方的某个点迟一些才到达该位置,因此无法更改该位置的值,恰好这个位置的距离才是正确的。
要明白,题意中是要寻找最近距离中的最大值。用BFS也就保证了能到达这个位置的点大家都同时达到,说白了,就是同一层的时候,大家更新的distance都是一样的。留到最后的也就是最终的赢家。
class Solution {
public int maxDistance(int[][] grid) {
int[] x = new int[]{1,-1,0,0};
int[] y = new int[]{0,0,1,-1};
int distance = 0;
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,0});
}
}
}
if(q.size()==0 || q.size()==n*n) return -1;
while(!q.isEmpty()){
int[] tmp = q.poll();
int x1 = tmp[0];
int y1 = tmp[1];
int distance1 = tmp[2];
distance = Math.max(distance,distance1);
for(int i=0;i<4;i++){
int x2 = x1 + x[i];
int y2 = y1 + y[i];
if(x2>=0 && x2<n && y2>=0 && y2<n && grid[x2][y2]==0){
grid[x2][y2] = 1;
q.add(new int[]{x2,y2,distance1+1});
}
}
}
return distance;
}
}
为什么要用陆地找海洋呢?海洋找陆地行不行呢?好像也行,以后试一试!