前言
终于把这个学期大大小小的事务全部弄完了,从今天开始有序恢复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];
}
};