C++ | Leetcode C++题解之第542题01矩阵

题目:

题解:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        // 初始化动态规划的数组,所有的距离值都设置为一个很大的数
        vector<vector<int>> dist(m, vector<int>(n, INT_MAX / 2));
        // 如果 (i, j) 的元素为 0,那么距离为 0
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j] == 0) {
                    dist[i][j] = 0;
                }
            }
        }
        // 只有 水平向左移动 和 竖直向上移动,注意动态规划的计算顺序
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i - 1 >= 0) {
                    dist[i][j] = min(dist[i][j], dist[i - 1][j] + 1);
                }
                if (j - 1 >= 0) {
                    dist[i][j] = min(dist[i][j], dist[i][j - 1] + 1);
                }
            }
        }
        // 只有 水平向左移动 和 竖直向下移动,注意动态规划的计算顺序
        for (int i = m - 1; i >= 0; --i) {
            for (int j = 0; j < n; ++j) {
                if (i + 1 < m) {
                    dist[i][j] = min(dist[i][j], dist[i + 1][j] + 1);
                }
                if (j - 1 >= 0) {
                    dist[i][j] = min(dist[i][j], dist[i][j - 1] + 1);
                }
            }
        }
        // 只有 水平向右移动 和 竖直向上移动,注意动态规划的计算顺序
        for (int i = 0; i < m; ++i) {
            for (int j = n - 1; j >= 0; --j) {
                if (i - 1 >= 0) {
                    dist[i][j] = min(dist[i][j], dist[i - 1][j] + 1);
                }
                if (j + 1 < n) {
                    dist[i][j] = min(dist[i][j], dist[i][j + 1] + 1);
                }
            }
        }
        // 只有 水平向右移动 和 竖直向下移动,注意动态规划的计算顺序
        for (int i = m - 1; i >= 0; --i) {
            for (int j = n - 1; j >= 0; --j) {
                if (i + 1 < m) {
                    dist[i][j] = min(dist[i][j], dist[i + 1][j] + 1);
                }
                if (j + 1 < n) {
                    dist[i][j] = min(dist[i][j], dist[i][j + 1] + 1);
                }
            }
        }
        return dist;
    }
};
相关推荐
早日退休!!!4 小时前
GCC与LLVM编译器深度解析:核心原理与差异对比(小白向)
c++·编辑器
黎雁·泠崖5 小时前
二叉树综合拔高:遍历还原与OJ题拓展训练
c语言·数据结构·leetcode
ChoSeitaku5 小时前
15.C++入门:list|构造|使用|迭代器失效
开发语言·c++·list
R&ain5 小时前
C++中的深浅拷贝
开发语言·c++
R&ain5 小时前
C++的内联函数
c++·算法
羑悻的小杀马特5 小时前
gflags+spdlog实战:C++命令行参数与高性能日志的极致搭配行动指南
c++·spdlog·gflags
漫随流水6 小时前
leetcode算法(111.二叉树的最小深度)
数据结构·算法·leetcode·二叉树
fpcc6 小时前
跟我学C++中级篇——Linux中文件和链接及重定向
linux·c++
Fcy6487 小时前
C++ set&&map的模拟实现
开发语言·c++·stl
POLITE313 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)
算法·leetcode·链表