题目:
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:
Input:
0 0 0 0 1 0 0 0 0Output:
0 0 0 0 1 0 0 0 0
Example 2:
Input:
0 0 0 0 1 0 1 1 1Output:
0 0 0 0 1 0 1 2 1
Note:
- The number of elements of the given matrix will not exceed 10,000.
- There are at least one 0 in the given matrix.
- The cells are adjacent in only four directions: up, down, left and right.
思路:
1、DFS:我们从每个值为0的格子开始进行DFS搜索,首先将当前格子的最近距离置为dist,然后朝四个方向进行搜索即可。需要注意的是,如果当前格子的值为0,那么需要将dist重置为0才可以。
2、BFS:用pair<int, int>来填充队列,其中第一个int标识格子所处的位置,第二个int标识当前格子距离0的最近距离。我们首先将所有0的位置的格子都加入队列中,然后依次处理队列中的每个元素。注意只有当ret[r][c] > dist的时候才需要更新ret[r][c]的值,并同时将其符合条件的邻居加入队列中,否则什么都不需要做。这样可以实现很有效的剪枝,大大提高效率。
代码:
1、DFS:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int row_num = matrix.size(), col_num = matrix[0].size();
vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX));
for (int r = 0; r < row_num; ++r) {
for (int c = 0; c < col_num; ++c) {
if (matrix[r][c] == 0) {
DFS(matrix, ret, r, c, 0);
}
}
}
return ret;
}
private:
void DFS(vector<vector<int>> &matrix, vector<vector<int>> &ret, int row, int col, int dist) {
int row_num = matrix.size(), col_num = matrix[0].size();
if (row < 0 || row >= row_num || col < 0 || col >= col_num || ret[row][col] <= dist) {
return;
}
if (matrix[row][col] == 0) {
dist = 0;
}
ret[row][col] = dist;
DFS(matrix, ret, row - 1, col, dist + 1);
DFS(matrix, ret, row + 1, col, dist + 1);
DFS(matrix, ret, row, col - 1, dist + 1);
DFS(matrix, ret, row, col + 1, dist + 1);
}
};
2、BFS:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int row_num = matrix.size(), col_num = matrix[0].size();
vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX));
queue<pair<int, int>> q; // {r * col_num + c, dist}
for (int r = 0; r < row_num; ++r) {
for (int c = 0; c < col_num; ++c) {
if (matrix[r][c] == 0) {
q.push(make_pair(r * col_num + c, 0));
}
}
}
while (!q.empty()) {
pair<int, int> p = q.front();
q.pop();
int r = p.first / col_num, c = p.first % col_num, dist = p.second;
if (ret[r][c] > dist) {
ret[r][c] = dist;
if (r - 1 >= 0 && matrix[r - 1][c] == 1 && ret[r - 1][c] > dist + 1) {
q.push(make_pair((r - 1) * col_num + c, dist + 1));
}
if (r + 1 < row_num && matrix[r + 1][c] == 1 && ret[r + 1][c] > dist + 1) {
q.push(make_pair((r + 1) * col_num + c, dist + 1));
}
if (c - 1 >= 0 && matrix[r][c - 1] == 1 && ret[r][c - 1] > dist + 1) {
q.push(make_pair(r * col_num + c - 1, dist + 1));
}
if (c + 1 < col_num && matrix[r][c + 1] == 1 && ret[r][c + 1] > dist + 1) {
q.push(make_pair(r * col_num + c + 1, dist + 1));
}
}
}
return ret;
}
};