1. 问题描述与理解
LeetCode 62题"不同路径"是一个经典的动态规划问题。题目描述如下:一个机器人位于一个 m x n 网格的左上角,每次只能向下或者向右移动一步。机器人试图达到网格的右下角,问总共有多少条不同的路径?
这个问题看似简单,但蕴含着动态规划的核心思想。我第一次遇到这个问题时,直觉告诉我可以用递归来解决,但很快就发现递归的效率太低。后来通过分析,发现这是一个典型的可以用动态规划优化的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力递归法
最直观的解法是使用递归。对于网格中的每个点(i,j),到达它的路径数等于从上方(i-1,j)来的路径数加上从左方(i,j-1)来的路径数。递归的终止条件是到达第一行或第一列的任何位置,因为在这些位置只有一条路径(要么一直向右,要么一直向下)。
python复制def uniquePaths(m, n):
if m == 1 or n == 1:
return 1
return uniquePaths(m-1, n) + uniquePaths(m, n-1)
这种方法虽然简单直观,但时间复杂度是指数级的O(2^(m+n)),在LeetCode上会超时。
2.2 动态规划解法
为了提高效率,我们可以使用动态规划。创建一个二维数组dp,其中dp[i][j]表示到达(i,j)位置的不同路径数。根据问题描述,可以得到状态转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
初始化条件是第一行和第一列的所有位置都只有1条路径。
python复制def uniquePaths(m, n):
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)。
2.3 空间优化解法
观察状态转移方程可以发现,我们只需要前一行的数据就可以计算当前行的数据。因此可以将空间复杂度优
