网站开发属于什么大学专业,网站备案 哪个省,页面设计的宗旨是什么,长沙网页设计工资高吗Leetcode - 62#xff1a;不同路径
题目#xff1a;
一个机器人位于一个 m x n 网格的左上角 #xff08;起始点在下图中标记为 “Start” #xff09;。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角#xff08;在下图中标记为 “Finish” #…Leetcode - 62不同路径
题目
一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 “Start” 。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为 “Finish” 。
问总共有多少条不同的路径 示例 1 输入m 3, n 7
输出28
示例 2
输入m 3, n 2
输出3
解释
从左上角开始总共有 3 条路径可以到达右下角。
1. 向右 - 向下 - 向下
2. 向下 - 向下 - 向右
3. 向下 - 向右 - 向下示例 3
输入m 7, n 3
输出28示例 4
输入m 3, n 3
输出6
笔记
dp[i][j]的含义到达二维图的ij点的路径条数。
初始化求的是到达重点的路径条数所以我们到达0,0点的路径数量为1
状态转移方程dp[i][j] dp[i - 1][j] dp[i][j - 1]因为只能向下或者向右走。
遍历顺序就从小到大即可
class Solution {
public:int uniquePaths(int m, int n) {vectorvectorint dp(m, vectorint(n, 0));dp[0][0] 1;for(int i 0; i m; i){dp[i][0] 1;}for(int i 0; i n; i){dp[0][i] 1;}for(int i 1; i m; i){for(int j 1; j n; j){dp[i][j] dp[i - 1][j] dp[i][j - 1];}}return dp[m - 1][n - 1];}
};
Leetcode - 63不同路径
题目
一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 “Start” 。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为 “Finish”。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径
网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1 输入obstacleGrid [[0,0,0],[0,1,0],[0,0,0]]
输出2
解释3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径
1. 向右 - 向右 - 向下 - 向下
2. 向下 - 向下 - 向右 - 向右示例 2 输入obstacleGrid [[0,1],[0,0]]
输出1
笔记
加了点障碍我们就对其进行特殊处理但不要忘记我们每次只能向右下方走不会拐弯抹角的走。
dp[i][j]的含义就是到达(i, j)点的路径数量
初始化我们需要对[i][0]和[0][i]这两条边进行初始化。遇到障碍物就直接break因为不可能有路径到后面的路了。
状态转移方程dp[i][j] dp[i - 1][j] dp[i][j - 1]但这里我们需要注意的是遇到障碍物我们要continue肯定不能用break啊因为我们又不知一种走的方法也不想最外围那两条边只要路被堵了后面就坑定过不去了。
遍历顺序从小到大;
class Solution {
public:int uniquePathsWithObstacles(vectorvectorint obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();vectorvectorint dp(m, vectorint(n, 0));for(int i 0; i m; i){if(obstacleGrid[i][0] 1){dp[i][0] 0;break;}dp[i][0] 1;}for(int i 0; i n; i){if(obstacleGrid[0][i] 1){dp[0][i] 0;break;}dp[0][i] 1;}for(int i 1; i m; i){for(int j 1; j n; j){if(obstacleGrid[i][j] 1){continue;}if(obstacleGrid[i][j] 0){dp[i][j] dp[i - 1][j] dp[i][j - 1];}}}return dp[m - 1][n - 1];}
};