01 矩阵 (Medium)*
题目描述*
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
注意*
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
代码*
最简单的思路从每个 1 开始用 bfs,找到最近的 0。但这样每次只能更新一个点,如果从 0 出发 bfs,可提升效率。
或者使用动态规划,先从左上到右下,再从右下到左上。
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int rows = matrix.size();
if(rows == 0) {
return matrix;
}
int cols = matrix[0].size();
vector<vector<int>> res(rows, vector<int>(cols, INT_MAX));
queue<pair<int, int>> q;
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(matrix[i][j] == 0) {
res[i][j] = 0;
q.push({i, j});
}
}
}
vector<pair<int, int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
while(!q.empty()) {
auto cur = q.front();
q.pop();
for(int i = 0; i < 4; i++) {
int x = cur.first + dirs[i].first, y = cur.second + dirs[i].second;
if(x >= 0 && y >= 0 && x < rows & y < cols) {
if(res[x][y] > res[cur.first][cur.second] + 1) {
res[x][y] = res[cur.first][cur.second] + 1;
q.push({x, y});
}
}
}
}
return res;
}
};
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0));
for(int i = 0; i < matrix.size(); i++) {
for(int j = 0; j < matrix[0].size(); j++) {
if(matrix[i][j] == 0) {
continue;
}
int i_1, j_1;
if(i != 0) {
i_1 = dp[i - 1][j] + 1;
}else {
i_1 = 10000;
}
if(j != 0){
j_1 = dp[i][j - 1] + 1;
}else {
j_1 = 10000;
}
dp[i][j] = (i_1 >= j_1) ? j_1 : i_1;
}
}
for(int i = matrix.size() - 1; i >= 0; i--) {
for(int j = matrix[0].size() - 1; j >= 0; j--) {
if(matrix[i][j] == 0) {
continue;
}
int i_1, j_1;
if(i != matrix.size() - 1) {
i_1 = dp[i + 1][j] + 1;
}else {
i_1 = 10000;
}
if(j != matrix[0].size() - 1) {
j_1 = dp[i][j + 1] + 1;
}else {
j_1 = 10000;
}
dp[i][j] = min(dp[i][j], min(i_1, j_1));
}
}
return dp;
}
};
最后更新: July 23, 2022