栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode--Java--542. 01 矩阵

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode--Java--542. 01 矩阵

题目描述

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

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

样例描述

思路

多源BFS (多源最短路问题)+ 图论思想

    从图论的角度来考虑本题,假设只有一个0,则相当于求每个点到0的距离,可以用bfs从0位置开始向四周扩散,依次距离加一,直到扫描完所有的结点。(设置一个访问数组,访问过的就标记)在1的基础上拓展, 如果是多个0,可以将这些0全部看成一个整体(难以理解的话,也可以想象成有一个超源点,这些0都连接到这个超源点,就可以转化为求每个点到超源点的距离,也即是1的情况),依次从每个0点开始BFS,然后不断入队新的位置,就会依次迭代更新每个位置到0的距离图论的角度考虑,这里队列存的是点的坐标,相邻的点距离固定为1
代码
class Solution {
    public int[][] updateMatrix(int[][] mat) {
        int m = mat.length, n = mat[0].length;
        int dist[][] = new int[m][n]; //答案数组
        int dx[] = new int[]{0, 1, 0, -1};
        int dy[] = new int[]{1, 0, -1, 0};
        boolean vis[][] = new boolean[m][n];
        Deque q = new linkedList<>();
        //将所有的0源点入队
        for (int i = 0; i < m; i ++ ) {
            for (int j = 0; j < n; j ++ ) {
                if (mat[i][j] == 0) {
                    q.offer(new int[]{i, j});
                    vis[i][j] = true;
                }
            }
        }
        //多源点BFS
        while (!q.isEmpty()) {
            int node[] = q.poll();
            //枚举四周
            for (int d = 0; d < 4; d ++ ) {
                int nx = node[0] + dx[d], ny = node[1] + dy[d];
                //没越界并且没出现过
                if (nx >= 0 && nx < m && ny >= 0 && ny < n && !vis[nx][ny]) {
                    dist[nx][ny] = dist[node[0]][node[1]] + 1;
                    vis[nx][ny] = true;
                    q.offer(new int[]{nx, ny});
                }
            }
        }
        return dist;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号