目录
思路
使用动态规划来解决,因为它具有最优子结构和重叠子问题的特点
解题过程
1、定义状态:
- 定义
dp[i][j]
表示从起始点(0, 0)
到达网格(i, j)
的不同路径数目。2、状态转移方程:
- 机器人只能向下或向右移动,因此到达
(i, j)
的路径数可以从上方(i-1, j)
或左侧(i, j-1)
的格子到达。因此,状态转移方程为:
- 边界条件:
- 当
i = 0
或j = 0
时,机器人只能沿着边界移动,路径数目为1
。3、初始化:
- 初始化
dp[0][j] = 1
和dp[i][0] = 1
,因为在边界上的每个格子只有一条路径可以到达。4、计算顺序:
- 根据状态转移方程,从左上角到右下角依次计算
dp[i][j]
的值。5、返回结果:
- 最终
dp[m-1][n-1]
即为从左上角到右下角的不同路径数目。
复杂度
- 时间复杂度:构建
dp
数组需要遍历整个二维数组,时间复杂度为O(m * n)
。 - 空间复杂度:使用了一个
m x n
的二维数组dp
,空间复杂度为O(m * n)
。
Code
class Solution(object):
def uniquePaths(self, m, n):
# 初始化一个二维数组 dp,大小为 m x n,全部初始化为 0
dp = [[0] * n for _ in range(m)]
# 起始点为 (0, 0),只有一条路径
dp[0][0] = 1
# 逐个计算每个格子的路径数目
for i in range(m):
for j in range(n):
# 对于每个格子 (i, j),可以从上方格子 (i-1, j) 或左方格子 (i, j-1) 到达
if i > 0:
dp[i][j] += dp[i-1][j] # 加上从上方格子到达的路径数目
if j > 0:
dp[i][j] += dp[i][j-1] # 加上从左方格子到达的路径数目
# 返回右下角格子 (m-1, n-1) 的路径数目
return dp[m-1][n-1]