当前位置: 首页 > news >正文

2.5路径问题专题:LeetCode 64. 最小路径和

动态规划解决最小路径和问题

1. 题目链接

LeetCode 64. 最小路径和

2. 题目描述

给定一个包含非负整数的 m x n 网格 grid,从网格的左上角出发,每次只能向右或向下移动一步,最终到达右下角。要求找到一条路径,使得路径上的数字总和最小。

3. 示例分析

示例输入

grid = [
  [1,3,1],
  [1,5,1],
  [4,2,1]
]

输出7
解释:最小路径为 1 → 3 → 1 → 1 → 1,路径和为 1 + 3 + 1 + 1 + 1 = 7

4. 算法思路

动态规划(Dynamic Programming)

定义 dp[i][j] 表示从起点 (0,0) 到达位置 (i-1,j-1) 的最小路径和。为了简化边界条件的处理,将 dp 数组的维度扩展为 (m+1) x (n+1),并初始化所有值为 INT_MAX

状态转移方程

对于每个位置 (i, j),其最小路径和由上方或左方的最小路径和决定:
dp[i][j] = grid[i-1][j-1] + min(dp[i-1][j], dp[i][j-1])
其中,grid[i-1][j-1] 是当前位置的值,dp[i-1][j] 是上方的路径和,dp[i][j-1] 是左方的路径和。

初始化
  • dp[0][1] = 0:设置一个虚拟起点 dp[0][1] 的值为0,使得起点 dp[1][1] 的值可以正确计算为 grid[0][0] + 0
  • 其余位置初始化为 INT_MAX,表示尚未计算。

5. 边界条件与注意事项

  1. 单行或单列网格:当 m=1n=1 时,路径是唯一的,直接累加所有元素即可。
  2. 索引转换dp[i][j] 对应网格中的 grid[i-1][j-1],需要注意索引偏移。
  3. 虚拟起点的作用:通过 dp[0][1] = 0 避免了在循环中单独处理起点 (1,1) 的初始化问题。
  4. 输入为空的情况:题目假设输入为非空网格,但实际代码中需注意 grid[0].size() 可能越界。

6. 代码实现

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[0][1] = 0; // 虚拟起点,用于初始化 dp[1][1]

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = grid[i - 1][j - 1] + min(dp[i - 1][j], dp[i][j - 1]);
            }
        }

        return dp[m][n];
    }
};

代码解释

  1. 初始化 dp 数组:通过 dp[0][1] = 0 使得起点 (1,1) 的值为 grid[0][0]
  2. 填充 dp 数组:遍历每个位置,根据上方和左方的最小值更新当前路径和。
  3. 返回结果:最终结果存储在 dp[m][n],表示到达右下角的最小路径和。

复杂度分析

  • 时间复杂度O(mn),遍历整个网格。
  • 空间复杂度O(mn),使用了 (m+1) x (n+1)dp 数组。

通过动态规划方法,能够高效解决二维网格中的最小路径和问题,适用于机器人导航、资源分配等实际场景。

http://www.dtcms.com/a/108820.html

相关文章:

  • Python的三方库之Pandas(三)
  • MetaBase Mysql8.0连接不上
  • 怎么理解量子比特模型,迁移到量子计算机开始编程
  • 飞桨新一代框架3.0正式发布:加速大模型时代的技术创新与产业应用
  • AF3 OpenFoldMultimerDataset类解读
  • 洛谷题单3-P1035 [NOIP 2002 普及组] 级数求和-python-流程图重构
  • JavaScript日期对象
  • Python 编程实战:打造高效便捷的目录结构生成器
  • 踩坑ubuntu24.04 编译vtk9.3.1的安卓版本
  • 前端开发技术演进与就业现实:顺应时代方能不被淘汰-优雅草卓伊凡
  • ubantu执行sudo chown -R username xxx(文件夹)命令失效
  • 推荐系统(二十一):基于MaskNet的商品推荐CTR模型实现
  • OpenCV 图形API(12)用于计算图像或矩阵的平均值函数mean()
  • dify开启多租户模式
  • Coco-AI 支持嵌入,让你的网站拥有 AI 搜索力
  • 基于javaweb的SSM+Maven机房管理系统设计与实现(源码+文档+部署讲解)
  • 智慧高炉厂可视化:钢铁行业的数字化转型之路
  • leetcode31.下一个排列
  • 42.C++11-右值引用与移动语义/完美转发
  • Real-Time Anomaly Detection of Network Traffic Basedon CNN
  • 动、静态创建任务
  • 实战打靶集锦-37-Wpwnvm
  • GUI-Guider 按钮按下 选项卡 右移动一个,到最右边停下
  • BMS电池关键参数及其含义
  • Lua中debug调试函数详解
  • 【DLI】Generative AI with Diffusion Models通关秘籍
  • Redis基础知识-2
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.1百度ERNIE、阿里通义千问的技术对比
  • 程序化广告行业(56/89):S2S对接与第三方广告监测全解析
  • 《第三次世界大战》第七章:破碎的未来