leetcode 542. 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。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
解题思路
广度优先搜索
因为矩阵只含0和1,所以1的邻居必定是0或1,要在01矩阵中找到1距离最近的0的距离,可以转换成每个0找到每个邻居1,再从邻居1找到非0邻居的1的求距离的问题。创建一个队列用于装坐标,对01矩阵进行一次遍历,把每个0点坐标入队,把每个1点坐标的值改为-1表示当前点1未被访问。将队列中的头结点出队,对于该头结点遍历其上下左右四个邻居,若邻居在边界内且未被访问过且不为0点(为-1),则将邻居的值改为当前结点值+1;改变了当前结点的邻居值后,把邻居也入队,直至队列为空时循环结束。
代码如下:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
if(matrix.empty()) return matrix;
int m=matrix.size();
int n=matrix[0].size();
deque<vector<int>> zero_deque;
//初始化队列和01矩阵,将所有0坐标入队
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
//等于0,入队
if(matrix[i][j]==0){
vector<int> tmp={i,j};
zero_deque.push_back(tmp);
}
//否则等于1改为-1,意义为未访问过
else{
matrix[i][j]=-1;
}
}
}
int dr[4]={-1,1,0,0};
int dc[4]={0,0,-1,1};
while(!zero_deque.empty()){
vector<int> tmp=zero_deque.front();
zero_deque.pop_front();
int r=tmp[0];
int c=tmp[1];
//4个方向的邻居
for(int i=0;i<4;i++){
//邻居坐标
int cur_r=r+dr[i];
int cur_c=c+dc[i];
//当前邻居在边界内且未被访问过
if(cur_r>=0 && cur_r<m && cur_c>=0 && cur_c<n
&&matrix[cur_r][cur_c]==-1){
matrix[cur_r][cur_c]=matrix[r][c]+1;
vector<int> t={cur_r,cur_c};
zero_deque.push_back(t);
}
}
}
return matrix;
}
看了题解好像也可以用动态规划,暂时没想到。