leetcode-542:01 矩阵

简介: leetcode-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]]

解题

方法一:BFS

参考链接

首先要确定是BFS还是DFS,由于是遇到最近的path,因此,一旦遇到一个近的0,就可以得出path,那么要选用BFS。

将mat中每个0都加入queue中,每个层的遍历,都使得path++,mat中非0的值,首次访问就被修改p,因为要求最近的,也就是使用BFS的关键所在。

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m=mat.size();
        int n=mat[0].size();
        vector<vector<int>> res(m,vector<int>(n,0));
        vector<vector<int>> dirs={{1,0},{-1,0},{0,1},{0,-1}};
        queue<pair<int,int>> q;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(mat[i][j]==0) q.push({i,j});
                else res[i][j]=-1;
            }
        }
        int path=1;
        while(!q.empty()){
            int l=q.size();
            for(int i=0;i<l;i++){
                auto [x,y]=q.front();
                q.pop();
                for(vector<int>& dir:dirs){
                    int nx=x+dir[0];
                    int ny=y+dir[1];
                    if(nx<0||nx>=m||ny<0||ny>=n) continue;
                    if(res[nx][ny]==-1){
                        res[nx][ny]=path;
                        q.push({nx,ny});
                    }
                }
            }
            path++;
        }
        return res; 
    }
};

方法二:动态规划

参考链接

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m=mat.size();
        int n=mat[0].size();
        vector<vector<int>> dp(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(mat[i][j]==0) dp[i][j]=0;
                else dp[i][j]=1e5;
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i-1>=0){
                    dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
                }
                if(j-1>=0){
                    dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
                }
            }
        }
        for(int i=m-1;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                if(i+1<m){
                    dp[i][j]=min(dp[i][j],dp[i+1][j]+1);
                }
                if(j+1<n){
                    dp[i][j]=min(dp[i][j],dp[i][j+1]+1);
                }
            }
        }
        return dp;
    }
};


相关文章
|
2月前
|
算法
力扣240 搜索二维矩阵II
力扣240 搜索二维矩阵II
|
4月前
|
算法 测试技术 C#
【二分查找】LeetCode1970:你能穿过矩阵的最后一天
【二分查找】LeetCode1970:你能穿过矩阵的最后一天
|
4月前
|
Go
golang力扣leetcode 240.搜索二维矩阵II
golang力扣leetcode 240.搜索二维矩阵II
19 0
|
4月前
|
算法 索引
leetcode-73:矩阵置零
leetcode-73:矩阵置零
15 0
|
4月前
leetcode-329:矩阵中的最长递增路径
leetcode-329:矩阵中的最长递增路径
23 0
|
7月前
【Leetcode -766.托普利茨矩阵 -771.宝石与石头】
【Leetcode -766.托普利茨矩阵 -771.宝石与石头】
31 0
【LeetCode-每日一题】-378. 有序矩阵中第K小的元素
【LeetCode-每日一题】-378. 有序矩阵中第K小的元素
|
2月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
|
4月前
|
算法
【Leetcode 74】搜索二维矩阵 —— 二分查找|矩阵
给你一个满足下述两条属性的`m x n`整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数
|
4月前
|
算法 测试技术 C#
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数

热门文章

最新文章