本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
一、题目:62.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
- 示例1:输入:m = 3, n = 7
- 输出:28
二、解析
确定dp数组及下标含义
本题dp数组为一个二维数组,dp[i][j]:表示从(0,0)走到(i,j)有dp[i][j]条不同路径。
确定递推公式
机器人每次只能向下或者向右移动一步,要移动到(i,j),则只能从(i-1,j)或(i,j-1)这两个位置过来,则有dp[i][j]=dp[i-1][j] + dp[i][j-1]。
dp数组初始化
在第0行中,要移动到(0,j)位置,则只能从左边的位置移动过去;同理在第0列中,要移动到(i,0)位置,则只能从上边的位置移动过去。所以dp[0][j]一定都是1,因为从(0, 0)的位置到(0, j)的路径只有一条,同样dp[i][0]也都是1。
// 初始化
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int i = 0; i < n; i++) dp[0][i] = 1;
遍历顺序
机器人从(0,0)位置开始移动,dp数组遍历可以嵌套两层循环,依次遍历即可。
举例推导dp数组
1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 3 | 6 | 10 | 15 | 21 | 28 |
三、代码实现
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int i = 0; i < n; i++) dp[0][i] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}