LeetCode-542. 01矩阵

题目描述 01矩阵

给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。

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

示例

输入:

0 0 0
0 1 0
0 0 0
输出:

0 0 0
0 1 0
0 0 0

解题思路一

动态规划

  • 第一次遍历,由左上两个方向的值来更新当前值
  • 第二次遍历,由右下两个方向的值来更新当前值

代码一

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m=matrix.size(),n=matrix[0].size();
        vector<vector<int>> res=matrix;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            if(res[i][j]) res[i][j]=INT_MAX-1;

        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(res[i][j]){
                    if(i>0) res[i][j]=min(res[i][j],res[i-1][j]+1);
                    if(j>0) res[i][j]=min(res[i][j],res[i][j-1]+1);
                }
            }
        for(int i=m-1;i>=0;i--)
            for(int j=n-1;j>=0;j--){
                if(res[i][j]){
                    if(i<m-1) res[i][j]=min(res[i][j],res[i+1][j]+1);
                    if(j<n-1) res[i][j]=min(res[i][j],res[i][j+1]+1);
                }
            }
        return res;
    }
};

解题思路二

广度优先搜索(BFS)

  • 先将矩阵中为0的位置都加入队列(x,y坐标,以长度为2的数组形式),并设置一个dir={{-1, 0}, {1, 0}, {0, -1}, {0, 1}}的数组用于方便求当前点的上下左右点的坐标。
  • 当队列不为空时,拿出每个当前点A,遍历他的左右上下四个点,若遍历过程中出现越过矩阵边界则直接跳过,或者出现该点(A点上下左右四个点中的一个)的值小于A+1,表明该点的最近0的路径非此条路径,也无需更新,直接跳过;否则将该点也加入队列,并设置该点的值为A点的值+1。

代码二

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> dirs{{0,-1},{-1,0},{0,1},{1,0}};
        queue<pair<int, int>> q;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j] == 0) q.push({i, j});
                else matrix[i][j] = INT_MAX;
            }
        }
        while (!q.empty()) {
            auto t = q.front(); q.pop();
            for (auto dir : dirs) {
                int x = t.first + dir[0], y = t.second + dir[1];
                if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] <= matrix[t.first][t.second] + 1)
                    continue;
                matrix[x][y] = matrix[t.first][t.second] + 1;
                q.push({x, y});
            }
        }
        return matrix;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,844评论 6 13
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 8,070评论 0 1
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 7,100评论 0 1
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,304评论 0 13
  • 姐姐。:“妈妈几点啦?我可以起床吗?” 我。:“现在十点啦。要做什么吃的给你吗?” 一骨碌爬起来坐好:“妈妈,我要...
    绘分享育儿训练营班长牙牙阅读 2,548评论 0 0