代码随想录 day39 | 62. 不同路径 63. 不同路径 II
62. 不同路径
思路
这道题有二叉树,动态规划和数论三种解法,在此只讨论动态规划的解法。
- 确定动态数组及下标含义
这道题是m×n个位置,因此可以使用二维数组,第一个下标表示x位置,第二个下标表示y位置。 - 确定递推公式。
因为只能向下和向右移动,所以每个位置的路径等于上位置和左位置的和 - 初始化
dp[0][j]和dp[i][0]的路径只有一条,因此初始化为1 - 确定遍历顺序
从上到下,从左到右遍历即可
实现
点击查看代码
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> path(m,vector<int>(n,0));
for(int i = 0; i < m; i++) path[i][0] = 1;
for(int j = 0; j < n; j++) path[0][j] = 1;
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
path[i][j] = path[i-1][j] + path[i][j-1];
}
}
return path[m-1][n-1];
}
};
复杂度分析
- 时间复杂度:O(m×n)
- 空间复杂度:O(m×n)
63. 不同路径 II
思路
与上一道题异曲同工。主要容易忽略点在于
- 初始化时,当出现障碍后,剩余位置的路径都为0;而遍历时将该位置设为0即可。
- 当[0][0]位置有障碍物时,直接返回0;
实现
点击查看代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if(obstacleGrid[0][0] == 1) return 0;
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> path(m, vector<int>(n, 0));
for(int i = 0; i < m; i++) {
if(obstacleGrid[i][0] != 1){
path[i][0] = 1;
}
else break;
}
for(int j = 0; j < n; j++) {
if(obstacleGrid[0][j] != 1) {
path[0][j] = 1;
}
else break;
}
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
if(obstacleGrid[i][j] != 1) {
path[i][j] = path[i-1][j] + path[i][j-1];
}
cout << path[i][j] << endl;
}
}
return path[m-1][n-1];
}
};
复杂度分析
- 时间复杂度:O(m×n)
- 空间复杂度:O(m×n)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?