算法第10周01 Matrix[medium]

来源:互联网 发布:上海闵行奥特莱斯淘宝 编辑:程序博客网 时间:2024/06/14 00:35

算法第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 00 1 00 0 0

Output:

0 0 00 1 00 0 0

Example 2:
Input:

0 0 00 1 01 1 1

Output:

0 0 00 1 01 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;         }};
原创粉丝点击