0x01.問題
給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。
兩個相鄰元素間的距離爲 1 。
給定矩陣的元素個數不超過 10000。
給定矩陣中至少有一個元素是 0。
矩陣中的元素只在四個方向上相鄰: 上、下、左、右。
示例:
輸入:
0 0 0
0 1 0
1 1 1
輸出:
0 0 0
0 1 0
1 2 1
public int[][] updateMatrix(int[][] matrix)
0x02.分析思路
讀題,發現問題的要點在於找出1到附近0的最近距離。
毫無疑問,採用BFS,並且對於這種對每個點都需要找距離的問題來說,使用多源BFS是最合適的。
- 把所有的0的點作爲BFS的第一層。
- 將1都初始化爲
Integer.MAX_VALUE
,省去了一個標記數組的空間。 - 對隊列中每一個元素,如果下一個點滿足條件且,下一個點的值爲
Integer.MAX_VALUE
,就設置下一點的值爲當前點的值加1。
0x03.解決代碼–多源BFS
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
int m=matrix.length;
int n=matrix[0].length;
Queue<int[]> queue=new LinkedList<>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
queue.add(new int[]{i,j});
}else{
matrix[i][j]=Integer.MAX_VALUE;
}
}
}
while(!queue.isEmpty()){
int arr[]=queue.poll();
for(int i=0;i<4;i++){
int nx=arr[0]+dx[i];
int ny=arr[1]+dy[i];
if(nx<0||ny<0||nx==m||ny==n) continue;
if(matrix[nx][ny]!=Integer.MAX_VALUE) continue;
matrix[nx][ny]=matrix[arr[0]][arr[1]]+1;
queue.add(new int[]{nx,ny});
}
}
return matrix;
}
}
願未來你所珍惜,值你珍惜。
ATFWUS --Writing By 2020–04–15