小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
原题:62. 不同路径
题目大意:如上图,有一个 m*n 的网格,有一个机器人在最左上角的格子里,它只能在网格中向下或者向右运动,求出它走到最右下角的格子总共有多少条不同的路径。
解题思路:
这个题目可以用动态规划来解决。解这道题需要找到一个关键的规律:如果到达第 m 行、第 n 列的格子的路径数量为 f(m,n),那么,f(m,n) = f(m-1, n) + f(m, n-1)。因为机器人智能向下或者向右移动,所以在到达 (m,n) 格子的前一步,机器人只能在 (m-1,n) 格子,或者 (m,n-1) 格子,因此,到达这两个格子的路径数量之和,就是到达 (m,n) 个字的路径数量。
有了以上的规律,实现起来就很简单了。初始化一个 m*n 的二维数组 dp,dp[0][0]表示其实位置,dp[m-1][n-1] 表示终点。接下来,只需要从起点开始,依次得出到达每一个格子的路径数量,知道计算到最后一个格子(也就是终点),就得到了最终答案。
最上面一排格子和最左边一列格子比较特殊,没办法通过上面格子的路径数量加左边格子的路径数量这个方法来计算,但是因为机器人只能向下或者向右走,所以这些个字的路径数量都是 1。
最终代码:
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
}
除了使用动态规划,还有一个不容易想到的办法,下面简单介绍一下。
由于机器人只能向下或者向右走,有 m 行 n 列的格子,则可以得出,机器人一定是右走 n-1 步、向下走 m-1 步,这两个步数是固定的,总的步数也是固定的,就是 m+n-2。因此,有多少条路径其实就是将 n-1 个向右走和 m-1 个向下走,进行组合。有多少种组合就有多少种不同的路径。因此答案就是:
有了这个,具体代码很容易,就略了。