63. 不同路径 II
✅做题思路or感想
一眼图论,但其实是动态规划
这一题和上面一题不同,有了障碍物的设计
dp数组的含义
- 求什么就设什么。
dp[i][j]
是到达坐标(i, j)
的不同路径数
递推公式
- 到达
(i, j)
的路径可以是从(i - 1, j)
来,也可以是从(i, j - 1)
来,题目求的是方法数,故这里就直接二者相加就好了。dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
- 然后如果
(i, j)
有障碍物,则dp[i][j] = 0
,因为障碍物无法通过,所以到达上面的方法数自然就是0了
初始化
- 这一题的坑点在于初始化。最上面一整行和最左边一整列的路径数都是1(因为只能无脑往左或者无脑往下),所以这里初始化要初始化最上面一行和最左边一列为1
- 然后因为这一道题有障碍物,所以在初始化时还要考虑障碍物的因素!!!
遍历顺序
- 因为从递推公式知道,后来的值是由前面的值推出,故从小到大
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int dp[150][150] = {0};
//行数,列数
int m = obstacleGrid[0].size();
int n = obstacleGrid.size();
//初始化
for (int i = 0; i < n; i++) {
//遇到障碍物时的处理
if (!obstacleGrid[i][0])dp[i][0] = 1;
else break;
}
//同上
for (int j = 0; j < m; j++) {
if (!obstacleGrid[0][j])dp[0][j] = 1;
else break;
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
//如果遇到了障碍物,则令其为0就好了
if (obstacleGrid[i][j] == 1)obstacleGrid[i][j] = 0;
else
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[n - 1][m - 1];
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端