题目链接:
题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
- 输入:m = 3, n = 7
- 输出:28
示例 2:
- 输入:m = 2, n = 3
- 输出:3
解释: 从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 3:
- 输入:m = 7, n = 3
- 输出:28
示例 4:
- 输入:m = 3, n = 3
- 输出:6
提示:
- 1 <= m, n <= 100
- 题目数据保证答案小于等于 2 * 10^9
题目解析:
dp四部曲
确定dp数组:f[x][y]表示机器人到达(x,y)的路径数
确定递推公式:f[x][y]=f[x-1][y]+f[x][y-1]
初始化dp数组:f[x][0]=1,f[0][y]=1
确定遍历顺序:从左到右,从上到下
后面还提供了滚动数组优化空间复杂度的方法
代码如下:
class Solution {
public int uniquePaths(int m, int n) {
//确定dp数组:f[x][y]表示机器人到达(x,y)的路径数
//确定递推公式:f[x][y]=f[x-1][y]+f[x][y-1]
//初始化dp数组:f[x][0]=1,f[0][y]=1
//确定遍历顺序:从左到右,从上到下
// int[][] f = new int[m][n];//定义dp数组
// //初始化dp数组
// for(int i = 0; i < m; i++) f[i][0] = 1;
// for(int i = 0; i < n; i++) f[0][i] = 1;
// for(int i = 1; i < m; i++)
// for(int j = 1; j < n; j++)
// f[i][j] = f[i - 1][j] + f[i][j - 1];
// return f[m - 1][n - 1];
//滚动数组优化,空间复杂度将为O(n)
int[] dp = new int[n];
for(int i = 0;i < n; i++) dp[i] = 1;
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
dp[j] = dp[j - 1] + dp[j];//dp[j]代表这一格上面一格的路径数,dp[j-1]表示这一格左边的路径数
return dp[n - 1];
}
}