leetcode.542 01矩阵

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

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

示例 1: 
输入:队列

0 0 0
0 1 0
0 0 0

输出:it

0 0 0
0 1 0
0 0 0

示例 2: 
输入:io

0 0 0
0 1 0
1 1 1

输出:class

0 0 0
0 1 0
1 2 1

注意:date

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

思路:BFS 的思路,将矩阵位置为 0 的下标压进队列,并将不为 0 的元素置为 Integer 的最大值。而后进行处理,逐渐将队列中的元素出队处理,看看这个出队的元素的上下左右方位,是否为 Integer 最大值,注意要下标越界的判断。List

代码:queue

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        Queue<int[]> queue = new LinkedList<>();
        for(int i = 0;i < m;++i){
            for(int j = 0;j < n;++j){
                if(matrix[i][j] == 0){
                    queue.offer(new int[]{i,j});
                }else{
                    matrix[i][j] = Integer.MAX_VALUE;
                }
            }
        }

        int[] dir = {{1,0},{-1,0},{0,1},{0,-1}};
        while(!queue.isEmpty()){
            int[] unit = queue.poll();
            for(int[] pos : dir){
                int x = unit[0] + pos[0];
                int y = unit[1] + pos[1];
                if(x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] <= matrix[unit[0]][unit[1]]+1){
                    continue;
                }
                queue.offer(new int[]{x,y});
                matrix[x][y] = matrix[unit[0]][unit[1]] + 1;
            }
        }
        return matrix;
    }
}