1. 问题背景与理解
Unique Paths是LeetCode上一道经典的动态规划问题,编号为62。题目描述如下:一个机器人位于m×n网格的左上角,每次只能向下或向右移动一步,问到达网格右下角有多少条不同的路径。
这道题之所以经典,是因为它完美展现了动态规划的核心思想——将大问题分解为子问题,并存储子问题的解以避免重复计算。我在第一次遇到这个问题时,尝试用递归暴力破解,结果在稍大的网格(比如19×13)就触发了超时。这让我意识到必须寻找更优解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划解法详解
2.1 状态定义与转移方程
定义dp[i][j]表示到达(i,j)位置的路径数。根据移动规则,机器人只能从上方或左方来到当前位置,因此状态转移方程为:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
边界条件是第一行和第一列的所有位置都只有1种路径(只能一直向右或向下)。
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]
2.2 空间优化技巧
观察状态转移方程可以发现,我们只需要前一行的数据即可计算当前行。因此可以将空间复杂度从O(mn)优化到O(n):
python复制def uniquePaths(m: int, n: int) -> int:
dp = [1] * n
for _ in range(1, m):
for j in range(1, n):
dp[j] += dp[j-1]
return dp[-1]
注意:在面试中如果能主动提出空间优化方案,通常会获得加分。建议先写出标准二维DP解法,再优化为一维。
3. 组合数学解法
3.1 数学原理分析
这个问题本质上是一个组合问题:从起点到终点需要移动(m-1)+(n-1)步,其中(m-1)步向
