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;
        }
    };
  • 相关阅读:
    工行ATM转账——事务操作
    logstash VS splunk
    centos yum Segmentation fault 问题解决办法
    Disruptor-net 3.3.0
    ISOLAR-A 入门教程
    Arctic教程(2.1)—— AUTOSAR应用程序设计入门(接口)
    Arctic教程(二)—— AUTOSAR应用程序设计入门
    Arctic教程(一)—— 创建AUTOSAR工程
    Arctic 教程
    【转】查看你的AWS服务器已使用流量
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602353.html
Copyright © 2011-2022 走看看