LeetCode中不同路径题解


LeetCode中不同路径题解-java

题目

62. 不同路径

难度中等782

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

img

例如,上图是一个7 x 3 的网格。有多少可能的路径?

示例 1:

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

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

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10 ^ 9

题解

方法一:组合数

思路

从左上角到右下角的过程中,我们需要移动 m+n−2 次,其中有 m−1 次向下移动,n−1 次向右移动。因此路径的总数,就等于从 m+n−2 次移动中选择 m−1 次向下移动的方案数,即组合数:
image-20201209103318966

代码实现

class Solution {
    public int uniquePaths(int m, int n) {
        // 思路:从左上角到右下角的过程中,需要移动m + n -2次,其中m-1次向下移动,n-1次向右移动
        // 因此路径的总数,就等于m+n-2次移动过程中m-1次向下移动的方案书,即组合数
        long ans=1;
        for(int i=0;i<Math.min(m-1,n-1);i++){            
            ans*=m+n-2-i;
            ans/=i+1;           
        }
        return (int)ans;
    }
}

复杂度分析

  • 时间复杂度:O(m)。由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得m≤n,这样空间复杂度降低至O(min(m,n))。
  • 空间复杂度:O(1)。

提交详情

image-20201209103427576

方法二:动态规划

思路

f(i,j)代表从左上角走到(i,j)的路径数量,由于我们每一步只能从向下或者向右移动一步,因此要想走到 (i,j),如果向下走一步,那么会从 (i−1,j) 走过来;如果向右走一步,那么会从 (i,j−1) 走过来。因此我们可以写出动态规划转移方程:f(i, j) = f(i-1, j) + f(i, j - 1),

边界条件及初始值: f(i, 0) = 1; f(0,j) = 1

最终的答案即为 f(m−1,n−1)。

代码实现

class Solution {
    public int uniquePaths(int m, int n) {
        // 方法一:动态规划
        // 思路:f(i,j)代表从左上角走到(i,j)的路径数量,所以得出
        // 动态规划转移方程:f(i, j) = f(i-1, j) + f(i, j - 1)
        //  边界条件及初始值: f(i, 0) = 1; f(0,j) = 1
        // 新建一个二维数组f, 用来存放每个位置的路径值
        int[][] f = new int[m][n];
        // 递推路径值,当为边界条件时,值为1,不在边界条件时,使用规划方程
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(i == 0 || j == 0){
                    f[i][j] = 1;
                }else{
                    f[i][j] = f[i - 1][j] + f[i][j - 1];
                }
            }
        }
        // 返回右下角到左上角的路径值
        return f[m - 1][n - 1];
    }
}

复杂度分析

  • 时间复杂度:O(mn)。
  • 空间复杂度:O(mn),即为存储所有状态需要的空间

提交详情

image-20201209103206014


文章作者: Loole
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Loole !
评论
  目录