✨题目

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。

✨样例

样例1

image.png

输入:mat = [[0,0,0],[0,1,0],[0,0,0]] 输出:[[0,0,0],[0,1,0],[0,0,0]]

样例2

image.png

输入:mat = [[0,0,0],[0,1,0],[1,1,1]] 输出:[[0,0,0],[0,1,0],[1,2,1]]

✨提示

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 104
  • 1 <= m * n <= 104
  • mat[i][j] is either 0 or 1.
  • mat 中至少有一个 0

✨解题:

分析:

这个题题面的意思大概就是要找到矩阵中所有的 1 到最近的 0 的距离。不妨翻转一下,从矩阵中的 0 开始,找到一步拓展能找到的所有的 1 ,那么这些 1 对应的最短距离应该就是 1,然后利用这些得到的 1,继续去拓展其他的点,每次的距离等于上一次的距离+1
image.png

AC代码:

  1. class Solution {
  2. public:
  3. int _next[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
  4. vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
  5. int m = mat.size();
  6. int n = mat[0].size();
  7. vector<vector<int>> dis(m,vector<int>(n));
  8. vector<vector<bool>> book(m,vector<bool>(n));
  9. queue<pair<int,int>> q;
  10. for(int i = 0;i < m;i++){
  11. for(int j = 0;j < n;j++){
  12. if(mat[i][j] == 0){
  13. q.push(make_pair(i,j)); // 把所有的超级源点加入到队列中
  14. book[i][j] = true; // 标记为访问过
  15. }
  16. }
  17. }
  18. while(!q.empty()){
  19. pair<int,int> p = q.front();
  20. q.pop();
  21. for(int i = 0;i < 4;i++){
  22. int next_x = p.first + _next[i][0];
  23. int next_y = p.second + _next[i][1];
  24. if(next_x < 0 || next_y < 0 || next_x >= m || next_y >= n){
  25. continue;
  26. }
  27. if(!book[next_x][next_y]){
  28. dis[next_x][next_y] = dis[p.first][p.second] + 1;
  29. q.push(make_pair(next_x,next_y));
  30. book[next_x][next_y] = true;
  31. }
  32. }
  33. }
  34. return dis;
  35. }
  36. };