01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离
两个相邻元素间的距离为 1
示例:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
- 给定矩阵的元素个数不超过 10000
- 给定矩阵中至少有一个元素是 0
- 矩阵中的元素只在四个方向上相邻:上、下、左、右。
个人理解:
应该挺好理解的,要得到的是最近距离,所有元素,那就广度优先搜索呗。
弄一个队列出来,然后只有一个 0 的时候,把 0 的位置加入队列,然后搜索所有。如果有多个 0,那就把所有的 0 都加入队列,然后在搜索。
注意:因为有多个 0,所以需要将距离实时更新为最短。
代码如下(C++):
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int numr = matrix.size(); // 获取矩阵大小
if(numr == 0) return matrix;
int numc = matrix[0].size();
if(numc == 0) return matrix;
// 初始化一个结果数组内容为INT_MAX
vector<vector<int>> res(numr, vector<int>(numc, INT_MAX));
queue<pair<int,int>> q; // 定义队列
vector<int> dx = {-1,1,0,0};
vector<int> dy = {0,0,-1,1};
for(int i = 0; i < numr; ++i){
for(int j = 0; j < numc; ++j){
if(matrix[i][j] == 0){ // 如果是 0 结果里面直接就为 0
res[i][j] = 0;
q.push(make_pair(i, j)); // 并且将 0 推入队列中
}
}
}
while(!q.empty()){ // BFS
int x = q.front().first; // 获取 x,y 坐标
int y = q.front().second;
q.pop(); // 推出
for(int j = 0;j<4;++j){ // 遍历
int nx = x + dx[j];
int ny = y + dy[j];
if(nx >= 0 && nx<numr && ny >= 0 && ny < numc && res[nx][ny]>res[x][y]+1){
res[nx][ny] = res[x][y] + 1; // 默认值为INT_MAX,对比,选择最短路径
q.push(make_pair(nx, ny)); // 然后推入附近的坐标
}
}
}
return res; // 返回结果
}
};
放在最后
如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~
更多精彩内容也可以访问我的博客Aelous-BLog