个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
点击直接跳转到该题目
目录
- 1️⃣题目描述
- 2️⃣题目解析
- 3️⃣解题代码
1️⃣题目描述
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0
来表示。
示例1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
示例2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
2️⃣题目解析
1.状态表示:dp[i][j]表示到达i,j位置时一共有多少种方法。
2.状态转移方程:分为两种情况:
情况一:有障碍物,当前位置dp值为0。
情况二:无障碍物,当前位置dp[i][j] = dp[i-1][j] + dp[i][j-1]
3.初始化:初始化时注意下标的映射关系,同时为了填表正确,在初始化时必须该dp[1][0]或者dp[0][1]
初始化为1
。
4.填表顺序,从上往下填写每一行,每一行从左往右。
5.返回值:返回dp[m][n]。
这里需要注意的时,创建dp表的时候,dp表的规模要在比之前多一行多一列。
3️⃣解题代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& ob) {
//创建dp表
//初始化
//填表
//返回值
int m = ob.size(), n = ob[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1));
dp[1][0] = 1;
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(ob[i-1][j-1] == 0)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m][n];
}
};