题目

题目来源:力扣(LeetCode)

给定一个由 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]]

  1. /**
  2. * @param {number[][]} mat
  3. * @return {number[][]}
  4. */
  5. var updateMatrix = function (matrix) {
  6. if (!matrix.length || !matrix[0].length) return null;
  7. let n = matrix.length;
  8. let m = matrix[0].length;
  9. // 初始化一个与源矩阵 matrix 一样长度的数组
  10. let ans = new Array(n);
  11. // 初始化一个新的矩阵,并且矩阵的值都初始化为 -1
  12. for (let i = 0; i < n; i++) ans[i] = new Array(m).fill(-1);
  13. let queue = [];
  14. // 遍历矩阵 matrix,找到所有 0 的位置 [i, j],将 0 的位置放入队列,并将 ans 矩阵中 [i, j] 的位置的值重置为 0
  15. for (let i = 0; i < n; i++)
  16. for (let j = 0; j < m; j++) {
  17. if (matrix[i][j] === 0) {
  18. ans[i][j] = 0;
  19. queue.push([i, j]);
  20. }
  21. }
  22. let dist = 0;
  23. while (queue.length) {
  24. let len = queue.length;
  25. dist++;
  26. for (let i = 0; i < len; i++) {
  27. let top = queue.shift();
  28. if (top[0] + 1 < n && ans[top[0] + 1][top[1]] === -1) {
  29. queue.push([top[0] + 1, top[1]]);
  30. ans[top[0] + 1][top[1]] = dist;
  31. }
  32. if (top[0] - 1 >= 0 && ans[top[0] - 1][top[1]] === -1) {
  33. queue.push([top[0] - 1, top[1]]);
  34. ans[top[0] - 1][top[1]] = dist;
  35. }
  36. if (top[1] + 1 < m && ans[top[0]][top[1] + 1] === -1) {
  37. queue.push([top[0], top[1] + 1]);
  38. ans[top[0]][top[1] + 1] = dist;
  39. }
  40. if (top[1] - 1 >= 0 && ans[top[0]][top[1] - 1] === -1) {
  41. queue.push([top[0], top[1] - 1]);
  42. ans[top[0]][top[1] - 1] = dist;
  43. }
  44. }
  45. }
  46. return ans;
  47. };