自学内容网 自学内容网

代码随想录训练营打卡第34天|62.不同路径 63.不同路径II

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;
                else
                    dp[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;
            else
                dp[0][i]=1;
        }
        bflag=0;
        for(int i=0;i<m;i++){
            if(obstacleGrid[i][0])
                bflag=1;
            if(bflag)
                dp[i][0]=0;
            else
                dp[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;
                else
                    dp[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) //如果在起点或终点出现了障碍,直接返回0
            return 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即可

今日总结

早点休息吧,最近好多事,这学期算法课又步骤了实验,感觉自己认真自己做一次实验得两三天,有些人半小时就搞定了,唉,无穷尽噫。


原文地址:https://blog.csdn.net/qq_73823477/article/details/144299754

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!