title: LeetCode中不同路径题解
description: LeetCode中不同路径题解-java
tags:
- LeetCode
- 算法
categories: LeetCode
abbrlink: ab2fe1e
date: 2020-12-09 10:23:00
LeetCode中不同路径题解-java
题目
62. 不同路径
难度中等782
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个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 次向下移动的方案数,即组合数:
代码实现
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)。
提交详情
方法二:动态规划
思路
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),即为存储所有状态需要的空间