LeetCode 62. 不同路径
62. 不同路径
Difficulty: 中等
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1\. 向右 -> 向下 -> 向下
2\. 向下 -> 向下 -> 向右
3\. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 10<sup>9</sup>
Solution
这是一道考察动态规划的题,解决动态规划的关键是如何将大的问题分解为小的子问题,在本题中令到达m,n网格的路径条数有f(m,n)
条,因为机器人只能向下或者向右移动,那么到达m,n之前只可能在(m,n-1)
或(m-1,n)
两个网格之间,那么可得f(m,n)=f(m,n-1)+f(m-1,n)
,即本题的动态转移方程。因此,我们可以从矩阵的(1,1)出发,向目标(m,n)递推逼近求解,时间复杂度为O(mn)
。
最近几天做了几道动态规划的题目之后慢慢地发现解题的一些规律了。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
paths = [[0] * (n+1) for _ in range(m+1)]
if m < 0 or n < 0:
return 0
paths[1][1] = 1
for i in range(1, m+1):
for j in range(1, n+1):
if i == 1 and j == 1:
continue
else:
paths[i][j] = paths[i-1][j] + paths[i][j-1]
return paths[m][n]