Given an m x n binary matrix mat, return the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:
Input: mat = [[0,0,0],[0,1,0],[0,0,0]]
Output: [[0,0,0],[0,1,0],[0,0,0]]
Example 2:
Input: mat = [[0,0,0],[0,1,0],[1,1,1]]
Output: [[0,0,0],[0,1,0],[1,2,1]]
Constraints:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j] is either 0 or 1.
There is at least one 0 in mat.
先标记所有0的位置,然后开始不停遍历整个矩阵,同时更新其中各个元素的最短距离,直到最后所有距离都是最短距离为止
impl Solution {
pub fn update_matrix(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let max = 10000;
let mut dists = vec![vec![max; mat[0].len()]; mat.len()];
for i in 0..mat.len() {
for j in 0..mat[0].len() {
if mat[i][j] == 0 {
dists[i][j] = 0;
}
}
}
let mut changed = true;
while changed {
changed = false;
for i in 0..mat.len() {
for j in 0..mat[0].len() {
let left = if j > 0 { dists[i][j - 1] } else { max };
let right = if j < mat[0].len() - 1 { dists[i][j + 1] } else { max };
let top = if i > 0 { dists[i - 1][j] } else { max };
let bottom = if i < mat.len() - 1 { dists[i + 1][j] } else { max };
let min = left.min(right.min(top.min(bottom))) + 1;
if dists[i][j] > min {
dists[i][j] = min;
changed = true
}
}
}
}
dists
}
}