[LeetCode] BFS 之 01 Matrix

题目

题目描述

题目分析

这着实是一道简单的BFS题目,虽然我不明白我为什么是在DFS的部分看到了这题。很明显的BFS,也非常简单,比之前做过的下棋的什么的都要简单,只能算是复习了一下BFS的实操吧。其实我看discuss中dp也可以做,但是这部分我想之后再讨论。不过我看discuss中很多人都用了pair还有c++11中类似python的for循环,这个确实值得学习,我还没有完全习惯用c++11中的特性。

时间复杂度分析

普通的BFS,时间复杂度为O(V + E)

代码

class Solution {
public:
    struct point{
        int x;
        int y;
        point(int _x, int _y) : x(_x), y(_y) {}
    };
    vector<vector<int> > updateMatrix(vector<vector<int> >& matrix) {
        //init the matirx;
        int height = matrix.size(), width = matrix[0].size();
        queue<point > q;
        int x[4] = {-1, 1, 0, 0};
        int y[4] = {0, 0, 1, -1};
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (matrix[i][j] == 0) q.push(point(i,j));
                else matrix[i][j] = INT_MAX;
            }
        }
        while (!q.empty()) {
            point p = q.front();
            q.pop();
            for (int i = 0; i < 4; i++) {
                if (p.x + x[i] < height && p.y + y[i] < width && matrix[p.x + x[i]][p.y + y[i]] == INT_MAX) {
                    matrix[p.x + x[i]][p.y + y[i]] = matrix[p.x][p.y] + 1;
                    q.push(point(p.x + x[i], p.y + y[i]));
                }
            }
        }
        return matrix;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34035179/article/details/78142975