Partage de technologie

Entraînement à l'algorithme (leetcode) Jour 29 | 62. Différents chemins, 63. Différents chemins II

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Enregistrement des questions au pinceau

*62. Différents chemins

adresse de la question leetcode

La valeur de chaque cellule est déterminée par les cellules du dessus et de gauche, les cellules du haut et de gauche doivent donc être initialisées en premier. Étant donné que la question exige que vous puissiez uniquement vous déplacer vers le bas et vers la droite, les cellules du haut et de la gauche sont initialisées à 1.

complexité temporelle : O ( m ∗ n ) O(m*n)O(mn)
Complexité spatiale : O ( m ∗ n ) O(m*n)O(mn)

// c++
class Solution {
public:
    
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector(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];
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

63. Différents chemins II

adresse de la question leetcode

L'idée est similaire à la question précédente et des obstacles sont ajoutés en fonction de la question précédente. Le tableau dp représente le nombre de chemins pour atteindre la cellule (i, j), et la position de l'obstacle est 0 dans le tableau dp. À partir de l'initialisation de la première ligne et de la première colonne, si un obstacle apparaît sur le chemin, les cellules derrière l'obstacle ne seront pas accessibles et les valeurs du tableau dp correspondantes seront toutes 0.

complexité temporelle : O ( m ∗ n ) O(m*n)O(mn)
Complexité spatiale : O ( m ∗ n ) O(m*n)O(mn)

// c++
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> dp(obstacleGrid.size(), vector(obstacleGrid[0].size(), 0));
        // 标志单元格是否可到达
        bool flag = true;
        // 初始化第一行
        for(int i=0; i<obstacleGrid.size(); i++){
            if(obstacleGrid[i][0] == 1) {
            	// 可以直接break
            	flag = false;
            }
            if(flag) dp[i][0] = 1;
            else dp[i][0] = 0;
        }
        // 标志单元格是否可到达
        flag = true;
        // 初始化第一列
        for(int j=0; j<obstacleGrid[0].size(); j++){
            if(obstacleGrid[0][j] == 1) {
            	// 可以直接break
            	flag = false;
            }
            if(flag) dp[0][j] = 1;
            else dp[0][j] = 0;
        }
        // 计算dp数组
        for(int i=1; i<obstacleGrid.size(); i++){
            for(int j=1; j<obstacleGrid[0].size(); j++){
                if(obstacleGrid[i][j]==1) continue;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37