Leecode-062-Unique Paths
思路:动态规划
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)
问总共有多少条不同的路径?
- 注意(这里有个坑,m是列数,n才是行数)
Solution:动态规划
确定状态方程
- 使用一个二维数组
dp
来存储答案,dp[i][j]
的值是从起始点(也就是(0,0)
)走到(i, j)
的路径数。
- 使用一个二维数组
初始化
- 第一行和第一列都初始化为1
- 当
i == 0
或者j==0
的时候,i-1
和j-1
会越界
状态转移
- 假设我们全都知道
dp[i][j]
的值,题目中说到,小机器人只能往右或者往下,那么dp[i][j]
的值就是第 i 行第 j 列这个格子的上面那个格子的值加上左边那个格子的值(本质也就是杨辉三角) - 也就是
dp[i][j]
=dp[i-1][j] + dp[i][j-1]
,因为这两个格子都可以走到dp[i][j]
这个格子,那么他们的路径数之和就是dp[i][j]
的值。
- 假设我们全都知道
Java
Solution :
1 | class Solution{ |
复杂度分析
时间复杂度: O(m∗n)
空间复杂度:O(m∗n)
方法二 : 组合数学
从左上角到右下角的过程中,我们需要移动
m+n-2
次,其中有m-1
次向下移动,n-1
次向右移动。因此路径的总数,就等于从 m + n - 2 次移动中选择 m - 1 次向下移动的方案数量,即组合数:
因此我们直接计算出这个组合数即可。计算的方法有很多种:
- 如果使用的语言有组合数计算的 API,我们可以调用 API 计算;
- 如果没有相应的 API,我们可以使用
Python:
1 | class Solution: |
Java
1 | class Solution { |
复杂度分析
- 时间复杂度 : O(m) 循环次数 y < m
- 空间复杂度: O(1)
打赏