62.不同路径
题目链接:不同路径
题目描述:一个机器人位于一个
m x n
**网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
解题思想:
机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。
按照动规五部曲来分析:
- 确定dp数组(dp table)以及下标的含义
dp[i][j] :表示从(0,0)出发,到(i, j) 有dp[i][j]条不同的路径。 - 确定递推公式
想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。 - dp数组的初始化
如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。 - 确定遍历顺序
这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> vec(m, vector<int>(n, 1));for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {vec[i][j] = vec[i - 1][j] + vec[i][j - 1];}}return vec[m - 1][n - 1];}
};
- 时间复杂度:O(mxn)
- 空间复杂度:O(mxn)
63. 不同路径 II
题目链接:不同路径 II
题目描述:一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用
1
和0
来表示。
解题思想:
dp数组的含义为从(0,0)到达(i,j)的不同路径数量。
与上一道题目思路基本相同,不同的是在初始化时,遇到障碍物后,后面的都要初始化为0了。在递推公式中如果遇到了障碍物,障碍物处dp要赋值为0.
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();vector<vector<int>> vec(m, vector<int>(n, 0));for (int i = 0; i < m; i++)if (obstacleGrid[i][0] != 1)vec[i][0] = 1;elsebreak;for (int i = 0; i < n; i++)if (obstacleGrid[0][i] != 1)vec[0][i] = 1;elsebreak;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] != 1)vec[i][j] = vec[i - 1][j] + vec[i][j - 1];}}return vec[m - 1][n - 1];}
};
- 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度
- 空间复杂度:O(n × m)