LeetCode刷题笔记 62. 不同路径 【动态规划】

动态规划

基础

时间复杂度: O ( m ∗ n ) O(m*n) O(mn)

空间复杂度: O ( m ∗ n ) O(m * n) O(mn)

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n));
        for(int i=0;i<n;i++) dp[0][i]=1;
        for(int i=0;i<m;i++) dp[i][0]=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];           
    }
};
  • 优化一:由于dp[i][j] = dp[i-1][j] + dp[i][j-1],因此只需要保留当前行与上一行的数据 (在动态方程中,即pre[j] = dp[i-1][j]),两行,空间复杂度O(2n);
  • 优化二:cur[j] += cur[j-1], 即cur[j] = cur[j] + cur[j-1] 等价于思路二–>> cur[j] = pre[j] + cur[j-1],因此空间复杂度为O(n).

优化1:空间复杂度 O(2n)

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<int> pre(n,1);
        vector<int> cur(n,1);
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++)
                cur[j]=cur[j-1]+pre[j];
            pre=cur;
        }
        return pre[n-1];
    }
};

优化2:空间复杂度 O(n)

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<int> cur(n,1);
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++)
                cur[j]+=cur[j-1];
        }
        return cur[n-1];
    }
};

你可能感兴趣的:(Leetcode)