都是通过bfs
来一层一层找最短路径
542
class Solution {
int[][] dir = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
public int[][] updateMatrix(int[][] matrix) {
Queue<int[]> q = new LinkedList<>();
boolean[][] visited = new boolean[matrix.length][matrix[0].length];
for(int i = 0 ; i< matrix.length;i++){
for(int j = 0; j < matrix[0].length;j++){
if(matrix[i][j] == 0){
q.offer(new int[]{i,j});
visited[i][j] = true;
}
}
}
while(!q.isEmpty()){
int[] n = q.poll();
int x = n[0];
int y = n[1];
visited[x][y] = true;
for(int[] i : dir){
int x1 = x + i[0];
int y1 = y + i[1];
if(x1>=0 && x1< matrix.length && y1>= 0 && y1 < matrix[0].length && !visited[x1][y1]){
matrix[x1][y1] = 1 + matrix[x][y];
q.offer(new int[]{x1,y1});
visited[x1][y1] = true;
}
}
}
return matrix;
}
}
286
class Solution {
private int[][] direction = {{0,1},{0,-1},{1,0},{-1,0}};
public void wallsAndGates(int[][] rooms) {
Queue<int[]> queue = new LinkedList<>();
int m = rooms.length;
if(m == 0) return;
int n = rooms[0].length;
for(int i = 0; i < rooms.length;i++){
for(int j = 0; j < rooms[0].length;j++){
if(rooms[i][j] == 0){
queue.add(new int[]{i,j});
}
}
}
while(!queue.isEmpty()){
int[] node = queue.poll();
int x = node[0];
int y = node[1];
for(int[] di : direction){
int r = x + di[0];
int c = y + di[1];
if (r >= 0 && c >= 0 && r < m && c < n && rooms[r][c] == Integer.MAX_VALUE) {
rooms[r][c] = rooms[x][y] + 1;
queue.add(new int[]{r,c});
}
}
}
}
}