LC 62.不同路径
题目链接:LC 62.不同路径
思路:之前的DP数组都是一维的;这道题是二维的;也是先举一个小例子,发现第一行和第一列都是1;然后第二行第二列开始为前一个数和上一个数之和,后面都是这样,因此遍历除第一行和第一列的数组就好。
代码:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0));//m*n的二维数组,所有值初始化为0
//初始化第一列
for(int i=0; i<m; i++){
dp[i][0]=1;
}
//初始化第一行
for(int j=0; j<n; j++){
dp[0][j]=1;
}
//遍历剩余数组
for(int a=1; a<m; a++){
for(int b=1; b<n; b++){
dp[a][b] = dp[a-1][b]+dp[a][b-1];
}
}
return dp[m-1][n-1];
}
};
LC 63. 不同路径 II
题目链接:LC 63. 不同路径 II
思路:按照上题思路,然后将障碍物的位置dp设置为0。注意初始化的时候,若遇到障碍物,则后面的不用初始化为1,直接break。
代码:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();//行数
int n = obstacleGrid[0].size();//列数
vector<vector<int>> dp(m, vector<int>(n,0));//创建m*n的dp数组
if(obstacleGrid[0][0]==1)return 0;
//同样初始化,但是若有障碍就不初始化为1了
for(int i=0; i<m; i++){
if(obstacleGrid[i][0]==1)break;
dp[i][0]=1;
}
for(int j=0; j<n; j++){
if(obstacleGrid[0][j]==1)break;
dp[0][j]=1;
}
//遍历整个数组
for(int a=1; a<m; a++){
for(int b=1; b<n; b++){
if(obstacleGrid[a][b]==1)continue;
dp[a][b] = dp[a-1][b]+ dp[a][b-1];
}
}
return dp[m-1][n-1];
}
};