问题
Given an m x n binary matrix mat, return the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
由于是搜索最近的距离,因此可以采用BFS搜索。
首先创建一个距离矩阵,将所有原矩阵为0的位置填上距离0,将其他位置填上无穷大。
使用BFS搜索,将所有0的坐标放入队列。
取出队列头元素,将其周围的距离矩阵的元素与自身距离矩阵的元素+1比较,将较小的值设置在周围的距离矩阵上。
同时,将改变数值的坐标再次放入队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
   | class Solution{     public int[][] updateMatrix(int[][] mat) {
          Queue<Integer> q = new LinkedList();         int row = mat.length;         int col = mat[0].length;         int[][] ans = new int[row][col];                                             for ( int i = 0; i < row; i++ ){             for (int j = 0; j < col; j++){                 if (mat[i][j] == 0){                     ans[i][j] = 0;                     q.add(i*col + j);                 }                 else{                     ans[i][j] = Integer.MAX_VALUE;                 }             }         }
                       while(!q.isEmpty()){             int i = q.peek() / col;             int j = q.poll() % col;                          if(i-1 >= 0 && ans[i][j]+1 < ans[i-1][j]){                 ans[i-1][j] = ans[i][j]+1;                 q.add((i-1)*col + j);             }             if(i+1 < row && ans[i][j]+1 < ans[i+1][j]){                 ans[i+1][j] = ans[i][j]+1;                 q.add((i+1)*col + j);             }             if(j-1 >= 0 && ans[i][j]+1 < ans[i][j-1]){                 ans[i][j-1] = ans[i][j]+1;                 q.add(i*col + (j-1));             }             if(j+1 < col && ans[i][j]+1 < ans[i][j+1]){                 ans[i][j+1] = ans[i][j]+1;                 q.add(i*col + (j+1));             }         }         return ans;     } }
  |