LeetCode 62 不同路径

LeetCode 62 不同路径

🟢 简单

无障碍物

https://leetcode.cn/problems/unique-paths/

显然递归

class Solution {

public:

    int uniquePaths(int m, int n) {

        if(m==1&&n==1) return 1;

        if(n<0||m<0) return 0;

        return uniquePaths(m,n-1)+uniquePaths(m-1,n);

    }

};

改进为dp

class Solution {

public:
    int uniquePaths(int m, int n) {

        int dp[m+1][n+1];

        memset(dp,0,sizeof dp);

        dp[0][1] = 1;

        for(int i = 1;i<=m;i++){

            for(int j = 1;j<=n;j++){

                dp[i][j] = dp[i][j-1]+dp[i-1][j];

            }

        }

        return dp[m][n];

    }

};

发现for循环中只用到了上面一行和左边一个,因此

class Solution {

public:

    int uniquePaths(int m, int n) {

        int dp[n+1];

        memset(dp,0,sizeof dp);

        int left = 1;

        for(int i = 1;i<=m;i++){

            for(int j = 1;j<=n;j++){

                dp[j] = left+dp[j];

                left = dp[j];

            }

            left = 0;

        }

        return dp[n];

    }

};

有障碍物

https://leetcode.cn/problems/unique-paths-ii/

class Solution {

public:

    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {

        int row = obstacleGrid.size();

        int col = obstacleGrid[0].size();

        int dp[row+1][col+1];

        memset(dp,0,sizeof dp);

        dp[0][1] =1;

        for(int i = 1;i<=row;i++){

            for(int j = 1;j<=col;j++){

                dp[i][j] = dp[i-1][j]+dp[i][j-1];

                if(obstacleGrid[i-1][j-1]==1) dp[i][j]=0;

            }

        }

        return dp[row][col];

    }

};