題目
給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。
兩個相鄰元素間的距離爲 1 。
思路
- 矩陣找最近距離的題目,首先考慮廣度優先遍歷算法。
- 最短距離是從0點開始逐層向外擴散,所以以所有值爲0的節點爲第一層逐漸向外遍歷。
- 一些tips:
(1) 矩陣的規格爲dp[n][m]時,dp[i][j]的位置可以用一個int表示:int sum = i*m+j
。
(2) 廣度優先遍歷需要先入先出,考慮使用隊列queue。
代碼
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int[][] dp = {{1,0},{0,1},{0,-1},{-1,0}};
int n = matrix.length;
int m = matrix[0].length;
boolean[][] used = new boolean[n][m];
Queue<Integer> queue = new LinkedList<>();
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(matrix[i][j]==0){
//先進先出———隊列
queue.add(i*m+j);
used[i][j]=true;
}
}
}
while(!queue.isEmpty()){
int sum = queue.poll();
int x = sum/m;
int y = sum%m;
for(int i=0; i<4; i++){
int x1 = x+dp[i][0];
int y1 = y+dp[i][1];
if(x1>=0&&x1<n&&y1>=0&&y1<m&&!used[x1][y1]){
matrix[x1][y1]=matrix[x][y]+1;
used[x1][y1]=true;
queue.add(x1*m+y1);
}
}
}
return matrix;
}
}
算法複雜度分析
- 時間複雜度:O(mn)
- 空間複雜度:O(mn)