01 矩陣--多源BFS

0x01.問題

給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。

兩個相鄰元素間的距離爲 1 。

給定矩陣的元素個數不超過 10000。
給定矩陣中至少有一個元素是 0。
矩陣中的元素只在四個方向上相鄰: 上、下、左、右。

示例:
輸入:
0 0 0
0 1 0
1 1 1
輸出:
0 0 0
0 1 0
1 2 1

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

0x02.分析思路

讀題,發現問題的要點在於找出1到附近0的最近距離。

毫無疑問,採用BFS,並且對於這種對每個點都需要找距離的問題來說,使用多源BFS是最合適的。

  • 把所有的0的點作爲BFS的第一層。
  • 將1都初始化爲Integer.MAX_VALUE,省去了一個標記數組的空間。
  • 對隊列中每一個元素,如果下一個點滿足條件且,下一個點的值爲Integer.MAX_VALUE,就設置下一點的值爲當前點的值加1。

0x03.解決代碼–多源BFS

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        int dx[] = { 0, 0, 1, -1 };
        int dy[] = { 1, -1, 0, 0 };   
        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.add(new int[]{i,j});
                }else{
                    matrix[i][j]=Integer.MAX_VALUE;
                }
            }
        }
        while(!queue.isEmpty()){
            int arr[]=queue.poll();
            for(int i=0;i<4;i++){
                int nx=arr[0]+dx[i];
                int ny=arr[1]+dy[i];
                if(nx<0||ny<0||nx==m||ny==n) continue;
                if(matrix[nx][ny]!=Integer.MAX_VALUE) continue;
                matrix[nx][ny]=matrix[arr[0]][arr[1]]+1;
                queue.add(new int[]{nx,ny});
            }
        }
        return matrix;
    }
}

願未來你所珍惜,值你珍惜。

ATFWUS --Writing By 2020–04–15

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章