前言
终于把这个学期大大小小的事务全部弄完了,从今天开始有序恢复LeetCode的练习吧
62. 不同路径(110)
class Solution {
public:
int uniquePaths(int m, int n) {
// dp matrix
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
// initialize
dp[m][n] = 1;
for (int i = n - 1; i >= 1; i--) {
dp[m][i] = 1;
}
for (int i = m - 1; i >= 1; i--) {
dp[i][n] = 1;
}
// dp[i][j] = dp[i + 1][j] + dp[i][j + 1]
for (int i = m - 1; i >= 1; i--) {
for (int j = n - 1; j >= 1; j--) {
dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
}
}
return dp[1][1];
}
};
63. 不同路径II(111)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
// dp matrix
vector<vector<long long>> dp(m, vector<long long>(n, 0));
// initialize
if (m == 1 && n == 1) return 1 - obstacleGrid[0][0];
if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1)
return 0;
for (int i = n - 2; i >= 0; i--) {
if (obstacleGrid[m - 1][i] == 1) break;
dp[m - 1][i] = 1;
}
for (int i = m - 2; i >= 0; i--) {
if (obstacleGrid[i][n - 1] == 1) break;
dp[i][n - 1] = 1;
}
// dp[i][j] = dp[i + 1][j] + dp[i][j + 1]
long long down, right;
for (int i = m - 2; i >= 0; i--) {
for (int j = n - 2; j >= 0; j--) {
if (obstacleGrid[i][j] == 1) continue;
down = obstacleGrid[i][j + 1] == 1 ? 0 : dp[i][j + 1];
right = obstacleGrid[i + 1][j] == 1 ? 0 : dp[i + 1][j];
dp[i][j] = down + right;
}
}
return dp[0][0];
}
};
博主分享了LeetCode中62题和63题的解决方案,分别涉及计算网格中从起点到终点的不同路径数量及考虑障碍物的情况。使用动态规划方法初始化并填充二维矩阵,计算到达目标点的路径总数。文章介绍了两种不同的实现策略,适合熟悉动态规划和路径查找的读者学习。
473

被折叠的 条评论
为什么被折叠?



