62.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
题目链接
个人题解
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp;dp.resize(m);for(int i=0;i<m;i++)dp[i].resize(n);for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0||j==0)dp[i][j]=1;elsedp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};
复杂度分析
- 时间复杂度:M*N
- 空间复杂度:M*N
解题思路
二维dp经典题目,每到一格的路径都等于其上一个路径数和左一格路径数的和
63.不同路径II
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109。
题目链接
个人题解
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {vector<vector<int>> dp;dp.resize(obstacleGrid.size());for(int i=0;i<obstacleGrid.size();i++)dp[i].resize(obstacleGrid[0].size());int m=obstacleGrid.size();int n=obstacleGrid[0].size();int bflag=0;for(int i=0;i<n;i++){if(obstacleGrid[0][i])bflag=1;if(bflag)dp[0][i]=0;elsedp[0][i]=1;}bflag=0;for(int i=0;i<m;i++){if(obstacleGrid[i][0])bflag=1;if(bflag)dp[i][0]=0;elsedp[i][0]=1;}for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(obstacleGrid[i][j])dp[i][j]=0;elsedp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};
//官解,我处理的有点复杂了
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0return 0;vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};
复杂度分析
- 时间复杂度:M*N
- 空间复杂度:M*N
解题思路
同上一道,不过遇到障碍把方法数置0即可
今日总结
早点休息吧,最近好多事,这学期算法课又步骤了实验,感觉自己认真自己做一次实验得两三天,有些人半小时就搞定了,唉,无穷尽噫。