news 2026/11/2 7:25:34

动态规划解最小路径和问题:LeetCode 64题详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划解最小路径和问题:LeetCode 64题详解

1. 最小路径和问题解析

这道题目来自著名的LeetCode Hot 100系列,编号64。给定一个m×n的非负整数网格,我们需要找到从左上角到右下角的路径,使得路径上的数字总和最小。每次移动只能向下或者向右一步。

这个问题看似简单,但蕴含着动态规划的经典思想。在实际应用中,类似的场景非常常见,比如物流路径规划、游戏地图寻路、资源分配优化等。理解这个问题的解法,能帮助我们掌握动态规划的核心思维方式。

2. 动态规划解法详解

2.1 状态定义与转移方程

我们定义dp[i][j]表示从起点(0,0)到位置(i,j)的最小路径和。根据题目限制,每个位置只能从上方或左方到达,因此状态转移方程为:

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

这个方程的意思是:到达当前位置的最小路径和,等于上方或左方较小值加上当前位置的值。

2.2 边界条件处理

对于第一行和第一列的特殊情况需要单独处理:

  • 第一行的每个位置只能从左方到达
  • 第一列的每个位置只能从上方到达

因此边界条件为:

  • dp[0][0] = grid[0][0]
  • 第一行:dp[0][j] = dp[0][j-1] + grid[0][j]
  • 第一列:dp[i][0] = dp[i-1][0] + grid[i][0]

2.3 代码实现示例

def minPathSum(grid): m, n = len(grid), len(grid[0]) dp = [[0]*n for _ in range(m)] dp[0][0] = grid[0][0] # 初始化第一行 for j in range(1, n): dp[0][j] = dp[0][j-1] + grid[0][j] # 初始化第一列 for i in range(1, m): dp[i][0] = dp[i-1][0] + grid[i][0] # 填充剩余表格 for i in range(1, m): for j in range(1, n): dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] return dp[-1][-1]

3. 空间复杂度优化

3.1 滚动数组优化

观察状态转移方程,我们发现dp[i][j]只依赖于上一行和当前行的数据。因此可以将空间复杂度从O(mn)优化到O(n):

def minPathSum(grid): m, n = len(grid), len(grid[0]) dp = [0]*n dp[0] = grid[0][0] # 初始化第一行 for j in range(1, n): dp[j] = dp[j-1] + grid[0][j] # 处理剩余行 for i in range(1, m): dp[0] += grid[i][0] # 更新第一列 for j in range(1, n): dp[j] = min(dp[j], dp[j-1]) + grid[i][j] return dp[-1]

3.2 原地修改优化

如果允许修改原数组,我们可以直接在原数组上进行计算,将空间复杂度优化到O(1):

def minPathSum(grid): m, n = len(grid), len(grid[0]) # 初始化第一行 for j in range(1, n): grid[0][j] += grid[0][j-1] # 初始化第一列 for i in range(1, m): grid[i][0] += grid[i-1][0] # 填充剩余表格 for i in range(1, m): for j in range(1, n): grid[i][j] += min(grid[i-1][j], grid[i][j-1]) return grid[-1][-1]

4. 算法复杂度分析

  • 时间复杂度:O(mn),因为我们需要遍历整个网格一次
  • 空间复杂度:
    • 基础版本:O(mn)
    • 滚动数组优化:O(n)
    • 原地修改:O(1)

5. 实际应用场景

最小路径和问题在实际中有广泛的应用:

  1. 物流路径规划:计算从仓库到目的地的最小运输成本路径
  2. 游戏开发:寻找角色移动的最小消耗路径
  3. 资源分配:优化资源使用路径,最小化总成本
  4. 图像处理:寻找图像中最小能量路径进行接缝裁剪

6. 常见问题与调试技巧

6.1 边界条件错误

常见错误是忘记处理第一行和第一列的特殊情况。调试时:

  • 检查网格大小为1×1的情况
  • 检查只有一行或一列的情况

6.2 初始化错误

确保dp数组初始值正确:

  • dp[0][0]必须等于grid[0][0]
  • 第一行和第一列的初始化要连续累加

6.3 空间优化时的覆盖问题

使用滚动数组优化时,注意不要覆盖还需要使用的数据。建议:

  • 先更新当前行的第一列
  • 然后从左到右更新其他列

7. 算法扩展与变种

7.1 允许对角线移动

如果允许从左上、左、上三个方向移动,只需修改状态转移方程: dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + grid[i][j]

7.2 带障碍物的网格

类似LeetCode 63题,某些格子不可达:

  • 遇到障碍物时dp值设为无穷大
  • 转移时跳过障碍物格子

7.3 输出具体路径

如果需要输出具体路径而不仅仅是和:

  • 额外维护一个path数组记录选择
  • 回溯时根据dp值决定移动方向

8. 性能优化建议

对于特别大的网格:

  1. 优先使用空间优化版本
  2. 考虑并行计算:每行可以独立计算
  3. 如果网格有特殊结构(如稀疏),可以针对性优化

9. 测试用例设计

全面的测试用例应包括:

  • 1×1网格
  • 单行或单列网格
  • 常规矩形网格
  • 包含0值的网格
  • 所有值相同的网格
  • 随机生成的大型网格

示例测试用例:

def test_minPathSum(): assert minPathSum([[1]]) == 1 assert minPathSum([[1,3,1],[1,5,1],[4,2,1]]) == 7 assert minPathSum([[1,2,3],[4,5,6]]) == 12 assert minPathSum([[0,0,0],[0,0,0]]) == 0

10. 与其他DP问题的关联

最小路径和问题与以下经典DP问题有密切联系:

  • 不同路径问题(LeetCode 62)
  • 带障碍物的不同路径(LeetCode 63)
  • 三角形最小路径和(LeetCode 120)
  • 地下城游戏(LeetCode 174)

理解这个问题的解法可以帮助解决这些相关问题。它们都体现了动态规划"最优子结构"和"重叠子问题"的特性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 7:25:19

Cypress USB3.0驱动开发实战:从枚举到300MB/s带宽调优

1. 为什么我要啃 Cypress USB3.0 驱动这块硬骨头搞嵌入式的人多少都碰过 Cypress 的 USB 芯片,尤其是 FX3 这一系列,在工业相机、数据采集卡、高速传输模块里出镜率极高。但很多人拿到开发板之后,跑个官方例程、点个灯、传几帧数据就觉得完事…

作者头像 李华
网站建设 2026/11/2 7:24:40

Vue项目CSS封装方案对比与实战指南

1. Vue项目中CSS封装方案现状与痛点在Vue项目开发中,CSS样式隔离一直是个棘手问题。传统方案如scoped属性虽然简单易用,但存在诸多局限性。我在多个大型项目中实测发现,当组件层级超过3层时,scoped生成的属性选择器会导致样式权重…

作者头像 李华
网站建设 2026/11/2 7:24:36

偏度与峰度实战:公式、代码口径与业务排查

1. 均值加方差不够用的那天:偏度与峰度到底补了什么位很多人第一次接触偏度和峰度,是在一张 SPSS 或者 Excel 的输出表里,看到两个陌生数字,不知道该看什么、该怎么解读,最后干脆略过。等到真正被它们咬一口&#xff0…

作者头像 李华
网站建设 2026/11/2 7:24:17

电商搜索专业词库建设:同义词、纠错与类目映射全链路

1. 电商搜索里最脏最累的活:先把"话"对上做站内搜索的都清楚一个事实:用户和商家从来没说过同一种语言。用户搜"防晒衣女夏薄款",商家标题写的是"冰丝防晒外套 UPF50 户外骑行服";用户搜"手机…

作者头像 李华
网站建设 2026/11/2 7:24:03

高并发在线客服系统架构设计与优化实践

1. 项目背景与核心挑战开发一个稳定可靠的在线客服系统绝非易事。经过多年的实战打磨,我深刻体会到这个看似简单的系统背后隐藏着诸多技术难点。在线客服系统本质上是一个高并发、低延迟的实时通信平台,需要同时处理海量用户连接、消息路由、状态同步等复…

作者头像 李华
网站建设 2026/11/2 7:23:07

Unity AssetBundle解包原理与合规实践指南

1. 这不是“破解”,而是资源合规复用的必要技术动作 “Unity 3D 资源解包工具”这个短语在开发者社区里常年高频出现,但很多人一看到“解包”就下意识联想到灰色操作——其实完全误解了它的本质。它既不是针对商业软件的逆向攻击,也不是绕过…

作者头像 李华