LeetCode-01矩阵

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

快速浏览
  1. 超级原点
  2. 广度优先
  3. 分层计算
代码一览

队列被用于广度优先的存储,因为可以先进先出,又JAVA中Queue是个抽象类,所以使用实现该类的LinkedList。对于方向的控制,用两个数组bx\by来控制,显得更加清晰。

这题最主要的是需要想到用广度优先的搜索算法,代码具体实现比较简单。

public int[][] updateMatrix(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;

        Queue< int[] > q = new LinkedList<>();
        boolean[][] marked = new boolean[m][n];
        int[][] ans = new int[m][n];

        for(int i = 0; i < m; i ++) {//初始化
            for(int j = 0; j < n; j ++) {
                marked[i][j] = false;
                if(matrix[i][j] == 0) {
                    marked[i][j] = true;
                    q.add(new int[]{i,j});
                    ans[i][j] = 0;
                }
            }
        }
        int[] bx = {0,1,0,-1};//方向矢量
        int[] by = {1,0,-1,0};
        while (!q.isEmpty()) {
            int[] xy = q.poll();
            int x = xy[0];
            int y = xy[1];
            for(int i = 0; i < 4; i ++) {
                if( 0 <= x + bx[i] && x + bx[i] < m
                        && 0 <= y + by[i] && y + by[i] < n
                        && !marked[x + bx[i]][y + by[i]]) {// 周围的点未被标记
                    marked[x + bx[i]][y + by[i]] = true;
                    q.add(new int[]{x + bx[i],y + by[i]});
                    ans[x + bx[i]][y + by[i]] = ans[x][y] + 1;
                }
            }
        }
        return ans;
    }

你可能感兴趣的:(LeetCode-01矩阵)