- 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
一开始的时候是想到BFS,从某个1出发,然后扩散,找到0就是长度了,结果写了一半感觉不太好写,换成了DFS,然后超时了。最后看了题解,BFS比较合适,不过用了逆向思维,是从0开始,原始的1设置为-1,表示没有管理过的1,很巧妙。
最后又试了试正常思维的BFS,结果和DFS一样,还是超时了。
逆向BFS (AC代码):
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
// vector<vector<int>> res(matrix.size(), vector<int> (matrix[0].size(),0));
queue<int> q,q2;
int m = matrix.size(), n = matrix[0].size();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
q.push(i);
q2.push(j);
} else {
matrix[i][j] = -1;
}
}
}
while(!q.empty()){
int x=q.front();
int y=q2.front();
q.pop();q2.pop();
if(x+1<matrix.size()&& matrix[x+1][y]==-1){
matrix[x+1][y]=matrix[x][y]+1;
q.push(x+1);
q2.push(y);
}
if(x-1>=0&& matrix[x-1][y]==-1){
matrix[x-1][y]=matrix[x][y]+1;
q.push(x-1);
q2.push(y);
}
if(y+1<matrix[0].size()&& matrix[x][y+1]==-1){
matrix[x][y+1]=matrix[x][y]+1;
q.push(x);
q2.push(y+1);
}
if(y-1>=0&& matrix[x][y-1]==-1){
matrix[x][y-1]=matrix[x][y]+1;
q.push(x);
q2.push(y-1);
}
}
return matrix;
}
};
如果是传统的BFS (超时):
class Solution {
public:
void bfs(vector<vector<int>>& matrix, vector<vector<int>>& res,int x, int y){
vector<vector<int>> vis(matrix.size(),vector<int> (matrix[0].size(),0));
int xx=x;
int yy=y;
queue<int> q;
queue<int> q2;
if(matrix[x][y]==0){
return ;
}
q.push(x);
q2.push(y);
while(!q.empty()){
res[xx][yy]++;
int n=q.size();
for(int i=0;i<n;++i){
int x=q.front();
q.pop();
int y=q2.front();
q2.pop();
vis[x][y]=1;
if(matrix[x][y]==0){
for(int i=0;i<matrix.size();++i){
for(int j=0;j<matrix[0].size();++j){
cout<<res[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
res[xx][yy]--;
return;
}
if(x+1<matrix.size() && !vis[x+1][y]){
q.push(x+1);
q2.push(y);
}
if(x-1>=0 && !vis[x-1][y]){
q.push(x-1);
q2.push(y);
}
if(y+1<matrix[0].size() && !vis[x][y+1]){
q.push(x);
q2.push(y+1);
}
if(y-1>=0 && !vis[x][y-1]){
q.push(x);
q2.push(y-1);
}
}
}
}
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int>> res(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){
bfs(matrix,res,i,j);
}
}
return res;
}
};