算法篇15-LeetCode1162. 地图分析

今日打卡题目

1162. 地图分析

我是按照我自己的第一思路 实现动态规划的。解决完题目之后发现还有很多种其它解法,可以看看题解。
我的思路:既然是动态规划,那就是需要2个东西,状态转移方程和初始状态。分析题目就是状态转移方程就是

tem[i][j] = Math.min(tem上下左右的数值+1, tem[i][j]);

有了状态转移方程就剩初始状态了。初始状态就是刚刚开始状态距离都是为最大就好了。按照题目意思,矩阵最大才100*100,我就是随便定了个400。动态规划完之后,就有每个点到最近的海洋距离了。然后再遍历一遍得到最后答案。

public int maxDistance(int[][] grid) {
        /**
         *
         * 功能描述:你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。
         *
         * 我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。
         *
         * 如果我们的地图上只有陆地或者海洋,请返回 -1。
         *
         * @param: [grid]
         * @return: int
         * @auther: smallfish
         * @date: 2020-03-29 14:29
         */
        if (grid.length < 2) {
            return -1;
        }
        int result = -1;

        //初始化tem
        int[][] tem = new int[grid.length][grid[0].length];
        for (int i = 0; i < tem.length; i++) {
            for (int i1 = 0; i1 < tem[0].length; i1++) {
                if (grid[i][i1] == 1) {
                    tem[i][i1] = 0;
                } else {
                    tem[i][i1] = 400;
                }
            }
        }

        //左上到右下
        for (int i = 0; i < tem.length; i++) {
            for (int j = 0; j < tem[0].length; j++) {
                if (i - 1 >= 0) {
                    tem[i][j] = Math.min(tem[i - 1][j] + 1, tem[i][j]);
                }
                if (j - 1 >= 0) {
                    tem[i][j] = Math.min(tem[i][j - 1] + 1, tem[i][j]);
                }
            }
        }

        //右下到左上
        for (int i = tem.length - 1; i >= 0; i--) {
            for (int j = tem[i].length - 1; j >= 0; j--) {
                if (i + 1 < tem.length) {
                    tem[i][j] = Math.min(tem[i + 1][j] + 1, tem[i][j]);
                }
                if (j + 1 < tem.length) {
                    tem[i][j] = Math.min(tem[i][j + 1] + 1, tem[i][j]);
                }
            }
        }

        for (int i = 0; i < tem.length; i++) {
            for (int j = 0; j < tem[i].length; j++) {
                if (tem[i][j] != 0) {
                    result = Math.max(tem[i][j], result);
                }
            }
        }

        if (result == 400) {
            return -1;
        }

        return result;

    }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容