1. 题目理解与问题拆解
棋盘路径问题是一个经典的动态规划入门题目。给定一个m×n的网格,机器人从左上角出发,每次只能向右或向下移动一步,最终到达右下角终点。我们需要计算出所有可能的路径数量。
这个问题可以抽象为一个数学上的组合问题。想象一下,要从起点走到终点,机器人必须执行以下动作序列:
- 向下移动 (m-1) 次
- 向右移动 (n-1) 次
因此,总的移动步数为 (m-1)+(n-1) = m+n-2步。所有可能的路径就是这些移动步骤的不同排列组合。
提示:在实际面试中,建议先画出3×3或2×3的小网格示例,通过枚举所有路径来直观理解问题。这能帮助面试官确认你真正理解了题意。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力递归解法剖析
2.1 递归思路实现
最直观的解法是使用递归。定义递归函数dfs(i,j)表示从(0,0)到(i,j)的路径数。根据题目规则,任何位置(i,j)只能从其上方(i-1,j)或左方(i,j-1)到达,因此有递归关系:
code复制dfs(i,j) = dfs(i-1,j) + dfs(i,j-1)
边界条件是当i=0或j=0时,只有一条直线路径,返回1。
java复制class Solution {
public int uniquePaths(int m, int n) {
return dfs(m - 1, n - 1);
}
private int dfs(int i, int j) {
if (i < 0 || j < 0) return 0;
if (i == 0 || j == 0) return 1;
return dfs(i - 1, j) + dfs(i, j - 1);
}
}
2.2 复杂度分析与缺陷
这种解法虽然简单,但存在严重的性能问题。以3×7的网格为例,递归树会指数级膨胀:
- 时间复杂度:O(2^(m+n)),因为每个递归调用会产生两个子调用
- 空间复杂度:O(m+n),由递归栈深度决定
在实际测试中,当m=n=20时,递归解法就已经无法在合理时间内完成计算。这是因为大量子问题被重复计算,比如dfs(18,18)会被计算数百万次。
