力扣62. 不同路径
题目来源(力扣):
https://leetcode.cn/problems/unique-paths/description/
题目描述:
一个机器人位于一个 m x n 网格的左上角 。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
问总共有多少条不同的路径?
基本思路:
依旧是动态规划入门级别题目,用于熟悉动态规划解决问题的5步方法论。
代码实现:
class Solution {
public:
int uniquePaths(int m, int n) {
// 1.定义dp数组 dp[i][j]表示从左上角(0,0)到位置(i,j)的走法为dp[i][j]
vector<vector<int>> dp(m, vector<int>(n));
// 2.确定递推公式
// dp[i][j]=dp[i-1][j]+dp[i][j-1];
// 3.初始化
for (int i = 0; i < m; i++)
dp[i][0] = 1;
for (int j = 0; j < n; j++)
dp[0][j] = 1;
// 4.确定遍历顺序
// 从左上方到右下方,但是优先遍历行
// 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];
// }
// 或者优先遍历列:
for (int j = 1; j < n; j++) {
for (int i = 1; i < m; i++)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
// 5.打印部分dp数组以确认是否符合预期
// for (int i = 0; i < m; i++) {
// for (int j = 0; j < n; j++) {
// cout << dp[i][j] << " ";
// }
// cout << endl;
// }
return dp[m - 1][n - 1];
}
};
时间复杂度
O(m*n)
补充
该二维数组可以优化为一维,
因为dp[i][j]只与dp[i-1][j]和dp[i][j-1]有关
dp[i-1][j]与dp[i][j]同列,且相邻;dp[i][j-1]与dp[i][j]同行,且相邻,
利用这个性质可以将数组缩小为一维的dp[j]
class Solution {
public:
int uniquePaths(int m, int n) {
// 1.定义dp数组
vector<int> dp(n + 1);
// 2.确定递推公式
// dp[j]=dp[j]+dp[j-1];
// 等号右边,dp[j]就相当于原来的dp[i-1][j]、dp[j-1]就相当于原来的dp[i][j-1]
// 3.初始化
for (int j = 0; j < n; j++)
dp[j] = 1;
// 4.确定遍历顺序 只能一行一行遍历
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++)
dp[j] = dp[j - 1] + dp[j];
// 5.打印(部分)dp数组以确认是否符合预期
// for(int j=0;j<n;j++)
// cout<<dp[j]<<" ";
// cout<<endl;
}
return dp[n - 1];
}
};
浙公网安备 33010602011771号