542. 01 Matrix
Difficulty: Medium
Topics: Depth-first Search, Breadth-first Search
Similar Questions:
Problem:
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,0]] Output: [[0,0,0], [0,1,0], [0,0,0]]
Example 2:
Input: [[0,0,0], [0,1,0], [1,1,1]] Output: [[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.
Solutions:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
if (m == 0) return {};
int n = matrix[0].size();
if (n == 0) return {};
queue<pair<int, int>> q;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == 0) {
q.push({i, j});
}
}
}
vector<vector<int>> ret(m, vector<int> (n, -1));
int level = 0;
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; ++i) {
auto coord = q.front(); q.pop();
int row = coord.first;
int col = coord.second;
if (row < 0 || row >= m || col < 0 || col >= n || ret[row][col] != -1) continue;
if (matrix[row][col] == 0) {
ret[row][col] = 0;
} else {
ret[row][col] = level;
}
q.push({row + 1, col});
q.push({row - 1, col});
q.push({row, col + 1});
q.push({row, col - 1});
}
++level;
}
return ret;
}
};