【LeetCode】动态规划——542.01 矩阵

LeetCode题目链接

https://leetcode.cn/problems/01-matrix/description/

题解

从左上到右下扫描一遍、从右下到左上扫描一遍,初始化全矩阵中为0的值对应的dp数组距离为0(注意错误思路"从四周初始化")。扫描时,不用再注意对应mat[i][j]值是否为1还是0,而是对全数组都进行min的判断,并且判断里要分两种情况,一种是左侧,一种是上侧(以及一种是右侧,一种是下侧),因此,就要对下标进行边界判断,只要不在初始边界出界的情况下都判断两侧,判断时,由于0已经初始化为了0,为1时自动判断是否+1为最小,而0永远不变,因此可以得出不判断0和1的情况所得的dp数组是正确的。

代码

cpp 复制代码
//542.01矩阵
#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        vector<vector<int>> dp(mat.size(),vector<int>(mat[0].size(), INT_MAX / 2));
        //初始化
        for (int i = 0;i < mat.size();i++) {
            for (int j = 0;j < mat[0].size();j++) {
				if (mat[i][j] == 0) {
					dp[i][j] = 0;
				}
            }
        }
        //看前面的不看后面的
        for (int i = 0;i < mat.size();i++) {
            for (int j = 0;j < mat[0].size();j++) {
                if (i > 0) dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1);
                if (j > 0) dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1);
            }
        }
        for (int i = mat.size() - 1;i >= 0;i--) {
            for (int j = mat[0].size() - 1;j >= 0;j--) {
                if (i < mat.size() - 1) dp[i][j] = min(dp[i][j], dp[i + 1][j] + 1);
                if (j < mat[0].size() - 1) dp[i][j] = min(dp[i][j], dp[i][j + 1] + 1);
            }
        }
        //递推公式
        return dp;
    }
};

int main() {
    Solution s;
    vector<vector<int>> mat = {
        {0},
        {0},
        {0},
        {0},
        {0}
    };
    vector<vector<int>> result = s.updateMatrix(mat);
    for (int i = 0;i < result.size();i++) {
		for (int j = 0;j < result[0].size();j++) {
			cout << result[i][j] << " ";
		}
		cout << endl;
    }
	return 0;
}
相关推荐
源代码•宸29 分钟前
Leetcode—1163. 按字典序排在最后的子串【困难】
经验分享·算法·leetcode·双指针
汤姆爱耗儿药4 小时前
矩阵初等变换的几何含义
线性代数·矩阵
岁月栖迟8 小时前
leetcode 49. 字母异位词分组
windows·算法·leetcode
Asmalin8 小时前
【代码随想录day 21】 力扣 77. 组合
算法·leetcode·职场和发展
等风来不如迎风去18 小时前
【动态规划】309. 买卖股票的最佳时机含冷冻期及动态规划模板
算法·动态规划
nonono1 天前
数据结构——线性表(链表,力扣中等篇,技巧型)
数据结构·leetcode·链表
小星星爱分享1 天前
抖音多账号运营新范式:巨推AI如何解锁流量矩阵的商业密码
人工智能·线性代数·矩阵
luckycoding1 天前
1424. 对角线遍历 II
算法·leetcode·职场和发展
刃神太酷啦1 天前
Linux 常用指令全解析:从基础操作到系统管理(1w字精简版)----《Hello Linux!》(2)
linux·运维·服务器·c语言·c++·算法·leetcode