layout | index | title | categories | tags | excerpt |
---|---|---|---|---|---|
post |
62 |
LeetCode-62.不同路径(Unique Paths) |
Leetcode |
Leetcode Array DP |
高中数学 |
- content {:toc}
一个机器人位于一个 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths/
Link:https://leetcode.com/problems/unique-paths/
O(MN)
最后一步,也就是终点,只能够从它的上边 or 左边到达
dp[x][y] = dp[x - 1][y] + dp[x][y - 1]
从左上到右下
dp[0][0] = 1
top第一排:
dp[0][y] = dp[0][y-1]
left第一列
dp[x][0] = dp[x-1][0]
代码如下:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0 for j in range(n)] for i in range(m)]
for i in range(m):
for j in range(n):
if i == 0 and j == 0:
dp[i][j] = 1
elif i == 0:
dp[i][j] = dp[i][j - 1]
elif j == 0:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[-1][-1]
O(K)
从左上走到右下,一共需要:
向右移动m - 1次
向下移动n - 1次
高中数学, N选K问题
K
C
N
k = min(m - 1, n - 1)
N = (m - 1) + (n - 1)
答案 = N选K问题, Combination(N, k) = n! / (k!(n - k)!)
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
n = m - 1 + n - 1
k = m - 1
top = 1
bottom = 1
for i in range(k):
top *= (n - i)
bottom *= (i + 1)
return top // bottom
--End--