动态规划解决不同路径问题:LeetCode 62与63题详解

发布时间:2026/10/27 19:10:27
动态规划解决不同路径问题:LeetCode 62与63题详解 1. 动态规划经典问题不同路径问题解析今天咱们来聊聊动态规划中两个非常经典的题目——不同路径LeetCode 62题和不同路径IILeetCode 63题。这两个问题不仅是算法面试中的常客更是理解动态规划思想的绝佳案例。我自己在准备面试时这两个题目反复刷了不下十遍每次都有新的收获。不同路径问题的核心是给定一个m×n的网格机器人从左上角出发每次只能向右或向下移动一步问到达右下角有多少种不同的路径。而不同路径II则在此基础上增加了障碍物使得问题更加贴近实际场景。理解这两个问题的解法对于掌握动态规划的基本思想和解题套路非常有帮助。2. 问题分析与状态定义2.1 基础问题不同路径62题我们先来看基础版本的不同路径问题。假设有一个m行n列的网格机器人位于左上角(0,0)位置每次只能向右或向下移动一步问到达右下角(m-1,n-1)有多少种不同的路径。这个问题可以用动态规划来解决关键在于如何定义状态和状态转移方程。经过多次实践我发现最直观的状态定义是dp[i][j]表示从起点到(i,j)位置的路径数量。这样定义后状态转移就非常自然了。提示在动态规划问题中好的状态定义应该能够包含问题的所有必要信息并且能够通过已知状态推导出新的状态。2.2 状态转移方程的推导根据题目条件机器人只能从上方或左方来到当前位置因此状态转移方程为 dp[i][j] dp[i-1][j] dp[i][j-1]这个方程的含义是到达(i,j)位置的路径数等于从上方来的路径数加上从左方来的路径数。边界条件也很重要第一行(i0)的所有位置只能从左方来所以dp[0][j] 1第一列(j0)的所有位置只能从上方来所以dp[i][0] 12.3 代码实现基于上述分析我们可以写出如下的Python实现def uniquePaths(m: int, n: int) - int: dp [[1]*n for _ in range(m)] for i in range(1, m): for j in range(1, n): dp[i][j] dp[i-1][j] dp[i][j-1] return dp[-1][-1]这个实现的时间复杂度是O(mn)空间复杂度也是O(mn)。不过在实际编码中我们可以优化空间复杂度到O(n)因为每次计算只需要上一行和当前行的信息。3. 进阶问题不同路径II63题3.1 问题描述与变化不同路径II在基础版本上增加了障碍物。网格中的某些格子被标记为障碍物机器人不能经过这些格子。我们需要计算在这种情况下从起点到终点的路径数量。这个变化使得问题更加复杂因为我们需要考虑障碍物对路径的影响。在实际编码面试中这个问题考察的是对边界条件的处理能力和代码的健壮性。3.2 状态转移方程的调整状态定义保持不变仍然是dp[i][j]表示到达(i,j)的路径数。但是状态转移需要考虑障碍物如果(i,j)是障碍物则dp[i][j] 0否则dp[i][j] dp[i-1][j] dp[i][j-1]与基础版本相同边界条件也需要调整第一行如果遇到障碍物则后面的所有格子都无法到达dp[0][j] 0第一列同理如果遇到障碍物则下面的所有格子都无法到达dp[i][0] 03.3 代码实现与优化考虑到障碍物的存在我们需要更谨慎地初始化dp数组。下面是Python实现def uniquePathsWithObstacles(obstacleGrid: List[List[int]]) - int: m, n len(obstacleGrid), len(obstacleGrid[0]) dp [[0]*n for _ in range(m)] # 初始化第一行和第一列 for i in range(m): if obstacleGrid[i][0] 1: break dp[i][0] 1 for j in range(n): if obstacleGrid[0][j] 1: break dp[0][j] 1 for i in range(1, m): for j in range(1, n): if obstacleGrid[i][j] 1: dp[i][j] 0 else: dp[i][j] dp[i-1][j] dp[i][j-1] return dp[-1][-1]这个实现同样可以优化空间复杂度。在实际面试中展示出空间优化能力会是一个加分项。4. 常见问题与调试技巧4.1 边界条件处理在实际编码中边界条件是最容易出错的地方。特别是对于不同路径II问题以下几个边界情况需要特别注意起点或终点本身就是障碍物第一行或第一列中有障碍物网格只有一行或一列我建议在编写代码前先手动列出这些边界情况确保代码能够正确处理它们。4.2 空间优化技巧虽然二维dp数组直观易懂但在实际应用中我们通常希望优化空间复杂度。对于不同路径问题可以使用滚动数组的技巧将空间复杂度优化到O(n)def uniquePaths(m: int, n: int) - int: dp [1] * n for i in range(1, m): for j in range(1, n): dp[j] dp[j-1] return dp[-1]对于不同路径II问题空间优化稍微复杂一些因为需要考虑障碍物对初始化条件的影响def uniquePathsWithObstacles(obstacleGrid: List[List[int]]) - int: m, n len(obstacleGrid), len(obstacleGrid[0]) dp [0] * n dp[0] 1 if obstacleGrid[0][0] 0 else 0 for i in range(m): for j in range(n): if obstacleGrid[i][j] 1: dp[j] 0 elif j 0: dp[j] dp[j-1] return dp[-1]4.3 调试与验证在解决这类问题时我通常会采用以下调试策略先在小网格上手动计算预期结果打印中间dp数组的值验证是否正确特别注意边界条件的处理是否正确对于不同路径II问题可以先用简单的障碍物布局测试例如对于2×2网格路径数应该是2如果在(0,1)位置有障碍物则路径数应为1。这些简单的测试用例可以帮助快速发现代码中的问题。5. 动态规划思想的深入理解5.1 为什么使用动态规划不同路径问题非常适合用动态规划解决因为它具有以下两个关键特性最优子结构问题的最优解包含子问题的最优解重叠子问题在递归求解过程中会重复计算相同的子问题通过将中间结果存储起来动态规划避免了重复计算大大提高了效率。5.2 与其他算法的对比这个问题也可以用组合数学的方法解决。对于m×n网格机器人需要移动(m-1)次向下和(n-1)次向右总路径数为C(mn-2, m-1)。不过这种方法只适用于没有障碍物的情况。相比之下动态规划的解法更加通用能够处理有障碍物的情况也更容易扩展到更复杂的问题变种。5.3 问题变种与扩展掌握了基础的不同路径问题后可以尝试解决一些变种问题例如路径中包含某些必须经过的点路径的权重不同如某些格子移动代价更高三维空间中的路径规划限制转向次数的路径规划这些变种问题可以帮助深化对动态规划的理解提高解决实际问题的能力。6. 实际应用与面试技巧6.1 在实际项目中的应用虽然不同路径问题看起来像纯粹的算法题但其思想在实际项目中有广泛应用游戏开发中的路径规划机器人导航系统物流配送路线优化电路板布线问题理解这些基础问题的解法有助于在面对实际工程问题时快速找到解决方案。6.2 面试中的表现技巧在算法面试中解决这类问题时可以遵循以下步骤明确问题并确认理解正确提出暴力解法并分析复杂度识别问题特性提出优化思路定义状态和状态转移方程考虑边界条件和初始化编写代码并验证讨论可能的优化如空间优化分析时间复杂度和空间复杂度在面试中清晰地展示这个思考过程比直接写出正确答案更重要。6.3 常见错误与避免方法根据我的经验初学者在解决这类问题时容易犯以下错误状态定义不清晰导致状态转移方程错误忽略边界条件特别是网格边界和障碍物的处理空间优化时错误地覆盖了需要的数据没有正确处理起点或终点是障碍物的情况避免这些错误的方法是多练习并在编写代码前先考虑各种边界情况。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询