来源:代码随想录
本题的力扣链接:https://leetcode-cn.com/problems/unique-paths/
1、题目描述:
2、思路:
机器⼈从(0 , 0) 位置出发,到(m - 1, n - 1)终点。
按照动规五部曲来分析:
3、代码:
3.1 python代码:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0 for i in range(n)] for j in range(m)] # 定义dp数组
# dp数组边界初始化
for i in range(n):
dp[0][i] = 1
for j in range(m):
dp[j][0] = 1
# 遍历二维数组,填充dp数组
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i-1][j] + dp[i][j-1] # 递推公式
return dp[m-1][n-1] # 输出最后一个状态,就是答案
3.2 C++代码:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector(n, 0)); //定义dp
// 初始化dp数组边界
for(int i = 0; i < m; i++){
dp[i][0] = 1; // 第一列都只有一个路径
}
for(int j = 0; j < n; j++){
dp[0][j] = 1; // 第一行都只有一个路径
}
// 遍历二维数组,填充dp数组
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1]; // 递推公式
}
}
return dp[m-1][n-1];
}
};
3.3 复杂度:
- 时间复杂度: O ( m ∗ n ) O(m * n) O(m∗n)
- 空间复杂度: O ( m ∗ n ) O(m * n) O(m∗n)
4、总结:
确定一道题用动态规算法做时,按如下做法:
- 1、确定dp数组及下标的含义;
- 2、确定递推公式;
- 3、dp数组如何初始化;
- 4、确定遍历顺序;
- 5、举例推导dp数组。