leetcode【每日一题】01 矩阵 Java

题干

给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例 1:

输入:

0 0 0
0 1 0
0 0 0
输出:

0 0 0
0 1 0
0 0 0

示例 2:

输入:

0 0 0
0 1 0
1 1 1
输出:

0 0 0
0 1 0
1 2 1

注意:

给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。

想法

首先确定题干说的距离是路径的距离,不是直线距离
这道题首先想到bfs
这篇写得很好,看它就行传送门

我是用的动态规划

首先初始化一个dp[][]
原本矩阵为0的位置肯定对应dp也为0
对于1的位置
每一步只能上下左右选一次
如果往左上走到了
那么最短的是
dp[i][j] = Math.min(dp[i][j-1], dp[i - 1][j]) + 1;
右下同理
只要这两个方向就行了

看代码

package daily;

import Exam.Up;

import java.util.Arrays;

public class UpdateMatrix {
    public int[][] updateMatrix(int[][] matrix) {
        //0处理
        if (matrix == null || matrix.length == 0) {
            return null;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m][n];
        //初始化 0为0 其余的为最大值
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = 10001;
                }
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i - 1 >= 0) {
                    //上
                    dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);
                }
                if (j - 1 >= 0) {
                    //左
                    dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
                }
            }
        }

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                if (i <= m - 2) {
                    //下
                    dp[i][j] = Math.min(dp[i][j], dp[i + 1][j] + 1);
                }
                if (j <= n - 2) {
                    //右
                    dp[i][j] = Math.min(dp[i][j], dp[i][j + 1] + 1);
                }

            }
        }
        return dp;

    }

    public static void main(String[] args) {
        UpdateMatrix updateMatrix = new UpdateMatrix();
        int[][] test1 = {{0, 0, 0}, {0, 1, 0}, {1, 1, 1}};
        int[][] res = updateMatrix.updateMatrix(test1);
        for (int[] tem:res
             ) {
            System.out.println(Arrays.toString(tem));

        }
    }
}

我的leetcode代码都已经上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3761

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/105530512