没有网站怎么做熊掌号,温岭市住房和城乡建设规划局网站,个人求职网站履历怎么做,wordpress linux下载62.不同路径 题目链接#xff1a;不同路径 题目描述#xff1a;一个机器人位于一个 m x n **网格的左上角 #xff08;起始点在下图中标记为 “Start” #xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角#xff08;在下图中标记为 “Finish… 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) {vectorvectorint vec(m, vectorint(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(vectorvectorint obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();vectorvectorint vec(m, vectorint(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)