算法第10周01 Matrix[medium]
Description
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:
Input:
0 0 0
0 1 0
0 0 0
Output:
0 0 0
0 1 0
0 0 0
Example 2:
Input:
0 0 0
0 1 0
1 1 1
Output:
0 0 0
0 1 0
1 2 1
Note:
The number of elements of the given matrix will not exceed 10,000.
There are at least one 0 in the given matrix.
The cells are adjacent in only four directions: up, down, left and right.
Solution
这道题的意思是找到离矩阵中1距离最近的0与1之间的距离。
我们可以采用BFS的方法,从所有的0出发,依次找到与之相距为1,2,3…的位置,如果这个距离小于本来的距离,那么就更新矩阵。
算法复杂度O(n*m)
class Solution {
public:
vector<vector<int> > updateMatrix(vector<vector<int> >& A) {
int n = A.size();
int m = A[0].size();
vector<vector<int> > dis(n, vector<int>(m));
queue<pair<int, int> > que;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (A[i][j] == 1) {
dis[i][j] = INT_MAX;
} else {
dis[i][j] = 0;
que.push(make_pair(i, j));
}
}
}
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; // 四个方向
while (!que.empty()) {
pair<int, int> curr = que.front();
que.pop();
for (int i = 0; i < 4; i++) {
int nr = curr.first+dir[i][0];
int nc = curr.second+dir[i][1];
if (nr >= 0&&nc >= 0&& nr < n&&nc < m) {
if (dis[nr][nc] > dis[curr.first][curr.second]+1) {
dis[nr][nc] = dis[curr.first][curr.second]+1;
que.push(make_pair(nr, nc));
}
}
}
}
return dis;
}
};