给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
输入: mat = [[0,0,0],[0,1,0],[0,0,0]]
输出: [[0,0,0],[0,1,0],[0,0,0]]
输入: mat = [[0,0,0],[0,1,0],[1,1,1]]
输出: [[0,0,0],[0,1,0],[1,2,1]]
- m = = m a t . l e n g t h m == mat.length m==mat.length
- n = = m a t [ i ] . l e n g t h n == mat[i].length n==mat[i].length
- 1 < = m , n < = 1 0 4 1 <= m, n <= 10^4 1<=m,n<=104
- 1 < = m ∗ n < = 1 0 4 1 <= m * n <= 10^4 1<=m∗n<=104
- m a t [ i ] [ j ] i s e i t h e r 0 o r 1. mat[i][j] \ is\ either \ 0\ or\ 1. mat[i][j] is either 0 or 1.
- m a t 中至少有一个 0 mat 中至少有一个 0 mat中至少有一个0
这道题也是图的 B F S BFS BFS 的应用。
题目要求我们找到每个 1 到达离它最近的 0 的距离。
我们只要把所有的 0 先入队,然后从 0 开始一层一层地向 1 扩散,扩散到某个 1 便同时在数组中将当前位置上的元素修改成层数,即最近距离。
class Solution {
public:
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
queue<pair<int, int>> que;
int m = mat.size(), n = mat[0].size();
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(mat[i][j] == 0)
que.push({i, j});
else
mat[i][j] = -1;
int level = 0;
while(!que.empty()) {
level++;
int size = que.size();
for(int i = 0; i < size; i++) {
auto cur = que.front();
que.pop();
for(int j = 0; j < 4; j++) {
int mx = cur.first + dx[j], my = cur.second + dy[j];
if(mx < 0 || mx >= m || my < 0 || my >= n || mat[mx][my] >= 0) {
continue;
}
que.push({mx, my});
mat[mx][my] = level;
}
}
}
return mat;
}
};