1.png

    1. class Solution {
    2. static int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    3. public int[][] updateMatrix(int[][] matrix) {
    4. int m = matrix.length, n = matrix[0].length;
    5. // 初始化动态规划的数组,所有的距离值都设置为一个很大的数
    6. int[][] dist = new int[m][n];
    7. for (int i = 0; i < m; ++i) {
    8. Arrays.fill(dist[i], Integer.MAX_VALUE / 2);
    9. }
    10. // 如果 (i, j) 的元素为 0,那么距离为 0
    11. for (int i = 0; i < m; ++i) {
    12. for (int j = 0; j < n; ++j) {
    13. if (matrix[i][j] == 0) {
    14. dist[i][j] = 0;
    15. }
    16. }
    17. }
    18. // 只有 水平向左移动 和 竖直向上移动,注意动态规划的计算顺序
    19. for (int i = 0; i < m; ++i) {
    20. for (int j = 0; j < n; ++j) {
    21. if (i - 1 >= 0) {
    22. dist[i][j] = Math.min(dist[i][j], dist[i - 1][j] + 1);
    23. }
    24. if (j - 1 >= 0) {
    25. dist[i][j] = Math.min(dist[i][j], dist[i][j - 1] + 1);
    26. }
    27. }
    28. }
    29. // 只有 水平向左移动 和 竖直向下移动,注意动态规划的计算顺序
    30. for (int i = m - 1; i >= 0; --i) {
    31. for (int j = 0; j < n; ++j) {
    32. if (i + 1 < m) {
    33. dist[i][j] = Math.min(dist[i][j], dist[i + 1][j] + 1);
    34. }
    35. if (j - 1 >= 0) {
    36. dist[i][j] = Math.min(dist[i][j], dist[i][j - 1] + 1);
    37. }
    38. }
    39. }
    40. // 只有 水平向右移动 和 竖直向上移动,注意动态规划的计算顺序
    41. for (int i = 0; i < m; ++i) {
    42. for (int j = n - 1; j >= 0; --j) {
    43. if (i - 1 >= 0) {
    44. dist[i][j] = Math.min(dist[i][j], dist[i - 1][j] + 1);
    45. }
    46. if (j + 1 < n) {
    47. dist[i][j] = Math.min(dist[i][j], dist[i][j + 1] + 1);
    48. }
    49. }
    50. }
    51. // 只有 水平向右移动 和 竖直向下移动,注意动态规划的计算顺序
    52. for (int i = m - 1; i >= 0; --i) {
    53. for (int j = n - 1; j >= 0; --j) {
    54. if (i + 1 < m) {
    55. dist[i][j] = Math.min(dist[i][j], dist[i + 1][j] + 1);
    56. }
    57. if (j + 1 < n) {
    58. dist[i][j] = Math.min(dist[i][j], dist[i][j + 1] + 1);
    59. }
    60. }
    61. }
    62. return dist;
    63. }
    64. }