刷题的第二十七天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day27 任务
62.不同路径
63. 不同路径 II

1 不同路径

62.不同路径
代码随想录刷题题Day27-LMLPHP
思路:

机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点
(1)确定dp数组以及下标的含义

(2)确定递推公式
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i - 1][j] + dp[i][j - 1] dp[i][j]=dp[i1][j]+dp[i][j1]

(3)dp数组如何初始化

for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;

(4)遍历顺序

(5)举例推导dp数组
代码随想录刷题题Day27-LMLPHP
C++:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i < m; i++) dp[i][0] = 1;
        for (int j = 0; j < n; j++) dp[0][j] = 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];
    }
};

时间复杂度: O ( m × n ) O(m × n) O(m×n)
空间复杂度: O ( m × n ) O(m × n) O(m×n)

2 不同路径 II

63. 不同路径 II
代码随想录刷题题Day27-LMLPHP
思路:

(1)确定dp数组以及下标的含义

(2)确定递推公式
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i - 1][j] + dp[i][j - 1] dp[i][j]=dp[i1][j]+dp[i][j1]

if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i][j]
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}

(3)dp数组如何初始化

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;

(4)遍历顺序

for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 0) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }

(5)举例推导dp数组
代码随想录刷题题Day27-LMLPHP
dp:
代码随想录刷题题Day27-LMLPHP
C++:

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) 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] == 0) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
};

时间复杂度: O ( n × m ) O(n × m) O(n×m),n、m 分别为obstacleGrid 长度和宽度
空间复杂度: O ( n × m ) O(n × m) O(n×m)


鼓励坚持二十八天的自己😀😀😀

01-07 13:45