Leetcode-542. 01 矩阵

链接

542. 01 矩阵

题目

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例

示例 1:
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

示例 2:
输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]

说明

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 10e4
  • 1 <= m * n <= 10e4
  • mat[i][j] is either 0 or 1.
  • mat 中至少有一个 0 

思路一(BFS)

我们可以先假设整个矩阵中只有一个0,那么只要从这个0开始进行广度优先搜索,这个0上下左右的1的距离全部为1,然后再外面一圈的1的距离全为2...以此类推。但该题矩阵中的0的个数不止一个而是有多个,这种情况下,我们就可以假设还存在一个超级0,所有的0到都是由这个超级0通过广度优先搜索搜到的,只不过他们的距离不是1而是0,这样就转化成了前面只有1个0的情况。

而具体的做法就是将所有的0的位置全都添加都队列当中,逐一进行广度优先搜索,依次减第二层,第三层搜索到的位置再次添加到队列当中进行广度优先搜索,每一轮距离+1。

C++ Code

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m=mat.size();
        int n=mat[0].size();
        vector<vector<int>> dist(m,vector<int>(n,0));
        vector<vector<bool>> view(m,vector<bool>(n,0));
        queue<pair<int, int>> q;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(mat[i][j]==0)
                {
                    view[i][j]=true;
                    q.emplace(i, j); //先将所有值为0的坐标加入到队列
                }

        int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        while(!q.empty())
        {
            auto [x,y]=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                int nx=x+dirs[i][0];
                int ny=y+dirs[i][1];
                if(nx>=0 && ny>=0 &&nx<m &&ny<n &&!view[nx][ny])
                {
                    dist[nx][ny]=dist[x][y]+1;
                    view[nx][ny]=true;
                    q.emplace(nx, ny);
                }
            }
        }
        return dist;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>