题目描述
给定一个由 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的位置加入队列,并且把非0的位置设置为最大值,然后以此从队列头部取出位置,然后检查其上下左右位置的值是否大于当前位置的值+1, 若大于, 则更新,同时加入队列,直到队列为空。
class Solution { public: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { vector<vector<int> > res; int m = matrix.size(); int n = matrix[0].size(); if(m==0) return res; queue<pair<int,int> > que; //把非0元素置成INT_MAX, 把0元素加入队列 for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(matrix[i][j]==1) matrix[i][j]=INT_MAX; else que.push({i,j}); //从0开始上下左右搜索, 如果搜索出大于当前值+1, 则进行更新,并把更新后的坐标加入队列 while(!que.empty()) { pair<int,int> t = que.front(); int i = t.first; int j = t.second; que.pop(); if(i-1>=0&&matrix[i-1][j]>matrix[i][j]+1) { matrix[i-1][j] = matrix[i][j]+1; que.push({i-1,j}); } if(j-1>=0&&matrix[i][j-1]>matrix[i][j]+1) { matrix[i][j-1] = matrix[i][j]+1; que.push({i,j-1}); } if(i+1<m && matrix[i+1][j]>matrix[i][j]+1) { matrix[i+1][j] = matrix[i][j]+1; que.push({i+1,j}); } if(j+1<n && matrix[i][j+1]>matrix[i][j]+1) { matrix[i][j+1] = matrix[i][j]+1; que.push({i,j+1}); } } return matrix; } };