zoukankan      html  css  js  c++  java
  • 队列&栈//01 矩阵

    给定一个由 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
    

    注意:

    1. 给定矩阵的元素个数不超过 10000。
    2. 给定矩阵中至少有一个元素是 0。
    3. 矩阵中的元素只在四个方向上相邻: 上、下、左、右。
    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];
                    int y = t.second + dir[1];
                    if(x<0||x>=m||y<0||y>=n||matrix[x][y]<=matrix[t.first][t.second])
                        continue;
                    matrix[x][y] = matrix[t.first][t.second]+1;
                    q.push({x,y});
                }
            }
            return matrix;
        }
    };
    class Solution {
    public:
        vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
            int m = matrix.size();
            int n = matrix[0].size();
            vector<vector<int>> res(m,vector<int>(n,INT_MAX-1));
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(matrix[i][j]==0)
                        res[i][j] = 0;
                    else{
                        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]!=0&&res[i][j]!=1){
                        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;
        }
    };
  • 相关阅读:
    10.$和#的区别 | 11.添加对象时如何把生成的id返回
    9. Mybatis的分页助手(pageHelper):
    8.逆向工程
    7.动态Sql语句
    6.关联查询
    5.解决列名与属性名不一致的情况
    4.接口与映射文件结合使用
    3.优化Mybatis
    2、Mybatis的编程Demo
    阿帕奇ab测试
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602353.html
Copyright © 2011-2022 走看看