题目地址(62. 不同路径)

https://leetcode-cn.com/problems/unique-paths/

题目描述

  1. 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 Start )。
  2. 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 Finish )。
  3. 问总共有多少条不同的路径?
  4. 示例 1
  5. 输入:m = 3, n = 7
  6. 输出:28
  7. 示例 2
  8. 输入:m = 3, n = 2
  9. 输出:3
  10. 解释:
  11. 从左上角开始,总共有 3 条路径可以到达右下角。
  12. 1. 向右 -> 向下 -> 向下
  13. 2. 向下 -> 向下 -> 向右
  14. 3. 向下 -> 向右 -> 向下
  15. 示例 3
  16. 输入:m = 7, n = 3
  17. 输出:28
  18. 示例 4
  19. 输入:m = 3, n = 3
  20. 输出:6
  21. 提示:
  22. 1 <= m, n <= 100
  23. 题目数据保证答案小于等于 2 * 109

前置知识


公司

  • 暂无

思路

  1. 确定dp数组的含义
    当网格的长和宽分别为m和n时 dp[i][j]为开始节点到mn节点的路径记录数
  2. 确定递推公式
    dp[m][n] = dp[m-1][n] + dp[m][n-1]
  3. 确定初始化数据
    Xdp[0][1] = 1 dp[1][0] = 1
    应该是m和n=0的时候这一整行和一整列都是1 不会有其他的数字 也就是

    for (int i = 0; i < n; i++) {
     dp[0][i] = 1;
    }
    for (int i = 0; i < m; i++) {
     dp[i][0] = 1;
    }
    
  4. 确定遍历顺序
    dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了

关键点


代码

  • 语言支持:Java

Java Code:

class Solution {
        public int uniquePaths(int m, int n) {
            //dp数组
            int[][] dp = new int[m][n];
            //初始化数据
            for (int i = 0; i < n; i++) {
                dp[0][i] = 1;
            }
            for (int i = 0; i < m; i++) {
                dp[i][0] = 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];
        }
    }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:62. 不同路径 - 图1#card=math&code=O%28n%29&id=WrCM3)
  • 空间复杂度:62. 不同路径 - 图2#card=math&code=O%28n%29&id=SMmlC)