62.不同路径
题目链接: https://leetcode.cn/problems/unique-paths/description/
思路:
我们很清楚的知道一点,当前位置只能由两个点到达,左边的点和上边的点。即到当前点的路径数目 = 到左边点的路径数目 + 到上边点的路径数目。
设 dp[ i ][ j ] 为到达 (i,j) 点的路径数目,则dp[ i ][ j ]=dp[ i-1 ][ j ]+dp[ i ][ j-1 ];
那我们就知道遍历顺序为从上到下,从左到右。同时初始状态为dp[1][1]=1,即到达起点的路径只有一条。
核心代码:
cpp
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[105][105];
memset(dp,0,sizeof(dp));
dp[1][1]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(i==1&&j==1) continue;
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
return dp[m][n];
}
};
63.不同路径II
题目链接: https://leetcode.cn/problems/unique-paths-ii/description/
思路:
我们很清楚的知道一点,当前位置只能由两个点到达,左边的点和上边的点。即到当前点的路径数目 = 到左边点的路径数目 + 到上边点的路径数目。
设 dp[ i ][ j ] 为到达 (i,j) 点的路径数目,则dp[ i ][ j ]=dp[ i-1 ][ j ]+dp[ i ][ j-1 ];
那我们就知道遍历顺序为从上到下,从左到右。同时初始状态为dp[1][1]=1,即到达起点的路径只有一条。
到目前的思路都和上一道题目一样。
但这题有个不同的地方,就是某些点上会有障碍,障碍点是不能走的,也就是说到达障碍点的路径条数为0,这一点需要我们在遍历时特判一下,其他的就没问题了。
核心代码:
cpp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int dp[105][105];
memset(dp,0,sizeof(dp));
if(!obstacleGrid[0][0]) dp[1][1]=1;
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(i==1&&j==1) continue;
if(obstacleGrid[i-1][j-1]) dp[i][j]=0;
else dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
return dp[m][n];
}
};
今日总结
今日学习时长1h,题难度也还算可以,题目非常的经典。