跳转至

542.01 矩阵 (Medium)*

题目描述*

标签*

深度优先搜索;广度优先搜索;

思路 & 代码*

这种找最近距离的用 bfs 就行了。最好想的就是从所有的 1 开始遍历,优化的就是可以从 0 开始遍历,这样只要先把所有 0 入队统一处理。

看题解还可以用 dp,扫描两遍。dp[i][j] 表示点到 0 的最短距离,dp[i][j] 为 0 或者相邻的 dp + 1,两个方向更新两次即可。

class Solution {
private:
    int bfs(vector<vector<int>>& matrix, int i, int j) {
        int m = matrix.size();
        int n = matrix[0].size();
        queue<pair<int, int>> q;
        q.push({i, j});
        int cnt = -1;
        while(!q.empty()) {
            int len = q.size();
            cnt++;
            while(len--) {
                auto x = q.front().first, y = q.front().second;
                q.pop();
                if(x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] == 0) {
                    return cnt;
                }
                q.push({x + 1, y});
                q.push({x - 1, y});
                q.push({x, y + 1});
                q.push({x, y - 1});
            }
        }
        return 0;
    }
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(matrix[i][j]) {
                    matrix[i][j] = bfs(matrix, i, j);
                }
            }
        }
        return matrix;
    }
};
class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        queue<pair<int, int>> q;
        vector<pair<int, int>> around = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(matrix[i][j]) {
                    matrix[i][j] = INT_MAX;
                }else {
                    q.push({i, j});
                }
            }
        }
        while(!q.empty()) {
            auto cur = q.front();
            q.pop();
            for(int i = 0; i < 4; i++) {
                int x = cur.first + around[i].first;
                int y = cur.second + around[i].second;
                if(x >= 0 && x < m && y >= 0 && y < n && matrix[cur.first][cur.second] + 1 < matrix[x][y]) {
                    matrix[x][y] = matrix[cur.first][cur.second] + 1;
                    q.push({x, y});
                }
            }
        }
        return matrix;
    }
};
class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(matrix[i][j] == 0) {
                    continue;
                }
                int l = (i == 0 ? 10001 : dp[i - 1][j] + 1);
                int u = (j == 0 ? 10001 : dp[i][j - 1] + 1);
                dp[i][j] = min(l, u);
            }
        }
        for(int i = m - 1; i >= 0; i--) {
            for(int j = n - 1; j >= 0; j--) {
                if(matrix[i][j] == 0) {
                    continue;
                }
                int r = (i == m - 1 ? 10001 : dp[i + 1][j] + 1);
                int d = (j == n - 1 ? 10001 : dp[i][j + 1] + 1);
                dp[i][j] = min(dp[i][j], min(r, d));
            }
        }
        return dp;
    }
};

最后更新: July 23, 2022