【LEETCODE】542.矩陣

題目

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

思路

  1. 矩陣找最近距離的題目,首先考慮廣度優先遍歷算法。
  2. 最短距離是從0點開始逐層向外擴散,所以以所有值爲0的節點爲第一層逐漸向外遍歷。
  3. 一些tips:
    (1) 矩陣的規格爲dp[n][m]時,dp[i][j]的位置可以用一個int表示:int sum = i*m+j
    (2) 廣度優先遍歷需要先入先出,考慮使用隊列queue。

代碼

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        int[][] dp = {{1,0},{0,1},{0,-1},{-1,0}};
        int n = matrix.length;
        int m = matrix[0].length;
        boolean[][] used = new boolean[n][m];
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(matrix[i][j]==0){
                    //先進先出———隊列
                    queue.add(i*m+j);
                    used[i][j]=true;
                }
            }
        }
        while(!queue.isEmpty()){
            int sum = queue.poll();
            int x = sum/m;
            int y = sum%m;
            for(int i=0; i<4; i++){
                int x1 = x+dp[i][0];
                int y1 = y+dp[i][1];
                if(x1>=0&&x1<n&&y1>=0&&y1<m&&!used[x1][y1]){
                    matrix[x1][y1]=matrix[x][y]+1;
                    used[x1][y1]=true;
                    queue.add(x1*m+y1);
                }
            }
        }
        return matrix;
    
    }
}

算法複雜度分析

  1. 時間複雜度:O(mn)
  2. 空間複雜度:O(mn)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章