leetcode542. 01 矩陣

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

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

示例 1:

輸入:

0 0 0
0 1 0
0 0 0
輸出:

0 0 0
0 1 0
0 0 0

示例 2:

輸入:

0 0 0
0 1 0
1 1 1
輸出:

0 0 0
0 1 0
1 2 1

注意:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/01-matrix
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

完整代碼

BFS:求1到0的距離

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        decltype(matrix) res(matrix);
        vector<vector<int>> dir = {{-1, 0},{0,-1}, {0,1}, {1, 0}};
        for(int i = 0; i < matrix.size(); ++i){
            for(int j = 0; j < matrix[0].size(); ++j){
                if(matrix[i][j])
                    BFS(matrix, dir, i, j, res[i][j]);
            }
        }
        return res;
    }
private:
    void BFS(vector<vector<int>>& matrix, vector<vector<int>>& dir, int i, int j, int &res){
        queue<pair<int, int>> q;
        q.push(make_pair(i ,j));
        
        while(!q.empty()){
            int n = q.size();
            while(n--){
                auto t = q.front();
                q.pop();
                for(auto d : dir){
                    int x = t.first + d[0];
                    int y = t.second + d[1];
                    if(x >= 0 && x < matrix.size() && y >= 0 && y < matrix[0].size()){
                        if(matrix[x][y] == 0)
                            return;
                        q.push(make_pair(x, y));
                    }
                } 
            }
            ++res;
        }
    }
};

BFS:求0到1的距離
這裏關鍵的步驟是標記,如果該位置已訪問過,說明已經有0到達該節點,就不用再訪問了。

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {        
        vector<vector<int>> dir = {{-1, 0},{0,-1}, {0,1}, {1, 0}}, res(matrix.size(), vector<int>(matrix[0].size(), 0)), visit(matrix.size(), vector<int>(matrix[0].size(), 0));
        queue<pair<int, int>> q;
        for(int i = 0; i < matrix.size(); ++i){
            for(int j = 0; j < matrix[0].size(); ++j){
                if(matrix[i][j] == 0){
                    q.push(make_pair(i, j));
                    visit[i][j] = 1;
                }
            }
        }
        while(!q.empty()){
            auto [x, y] = q.front();
            q.pop();
            for(auto d : dir){
                int tx = x + d[0];
                int ty = y + d[1];
                if(tx >= 0 && tx < matrix.size() && ty >= 0 && ty < matrix[0].size() && !visit[tx][ty]){
                    res[tx][ty] = res[x][y] + 1;
                    visit[tx][ty] = 1;
                    q.push(make_pair(tx, ty));
                }
            }
        }
        return res;
    }

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