🚩传送门:牛客题目
力扣题目

题目

机器人在 [NC]34. 不同路径的数目 I - 图1 大小的地图的左上角(起点),每次可以向下向右移动。要到达地图的右下角(终点)。
可以有多少种不同的路径从起点走到终点?
要求:空间复杂度 [NC]34. 不同路径的数目 I - 图2,时间复杂度 [NC]34. 不同路径的数目 I - 图3
进阶:空间复杂度 [NC]34. 不同路径的数目 I - 图4,时间复杂度 [NC]34. 不同路径的数目 I - 图5

示例 1:
image.png

输入:m = 3, n = 7 输出:28

解题思路:动态规划

👉 定义:[NC]34. 不同路径的数目 I - 图7 表示到达坐标 [NC]34. 不同路径的数目 I - 图8 的路径数量 。

我们看到这张图就明白一切:
[NC]34. 不同路径的数目 I - 图9

复杂度分析

时间复杂度:[NC]34. 不同路径的数目 I - 图10,其中 [NC]34. 不同路径的数目 I - 图11 为数组的行数,其中 [NC]34. 不同路径的数目 I - 图12 为数组列数 。

空间复杂度:[NC]34. 不同路径的数目 I - 图13,其中 [NC]34. 不同路径的数目 I - 图14 为数组的行数,其中 [NC]34. 不同路径的数目 I - 图15 为数组列数 。

官方代码

  1. public int uniquePaths (int m, int n) {
  2. // 定义dp数组
  3. int[][] dp = new int[m][n];
  4. for(int i = 0; i < m; i++){
  5. for(int j = 0; j < n; j++){
  6. // 当 i = 0:dp[0][j] = dp[0][j-1]
  7. if(i == 0){
  8. dp[i][j] = 1; // 都是1是因为dp[0][j] = dp[0][j-1],所以干脆全部赋值为1
  9. continue;
  10. }
  11. // 当 j = 0:dp[i][0] = dp[i-1][0]
  12. if(j == 0){
  13. dp[i][j] = 1;
  14. continue;
  15. }
  16. // 当 i > 1 && j > 1 : dp[i][j] = dp[i][j-1] + dp[i-1][j]
  17. dp[i][j] = dp[i-1][j]+dp[i][j-1];
  18. }
  19. }
  20. return dp[m-1][n-1]; // 返回到达终点的所有可行路径
  21. }