题目
题目分析
这着实是一道简单的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;
}
};