经典算法题:01 矩阵

一、题目

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

二、思路

元素0和自身的距离是0,元素1和0的距离等于0到1的距离。

用一个标记数组记录每个位置是否已经计算过距离。

初始化结果集和队列,遍历矩阵找到所有等于0的位置,结果集对应位置赋值0并且坐标入队。计算过距离的位置标记。

使用广搜,队列中元素出队后向四个方向分别搜索一次寻找1,如果搜索位置存在1则记录结果集距离为结果集中搜索源点的值+1,并且入队、标记。

三、实现

class Solution {

    public int[][] updateMatrix(int[][] matrix) {

        if (matrix == null || matrix.length == 0) {

            return null;

        }

        int m = matrix.length;

        int n = matrix[0].length;

        int[][] res = new int[m][n];

        boolean[][] visited = new boolean[m][n];

        Queue<int[]> queue = new LinkedList<>();

        for (int i = 0; i < m; i++) {

            for (int j = 0; j < n; j++) {

                if (matrix[i][j] == 0) {

                    res[i][j] = 0;

                    visited[i][j] = true;

                    queue.offer(new int[]{i, j});

                }

            }

        }

        int[][] direction = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};//上下左右

        while (!queue.isEmpty()) {

            int[] tmp = queue.poll();

            int i = tmp[0];

            int j = tmp[1];

            for (int k = 0; k < 4; k++) {

                int di = i + direction[k][0];

                int dj = j + direction[k][1];

                if (di >= 0 && di < m && dj >= 0 && dj < n && !visited[di][dj]) {

                    res[di][dj] = res[i][j] + 1;

                    visited[di][dj] = true;

                    queue.offer(new int[]{di, dj});

                }

            }

        }

        return res;

    }

}

发布了83 篇原创文章 · 获赞 0 · 访问量 4501

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105532736