力扣 62. 不同路径

96 阅读1分钟

image.png

image.png

方法一

直接使用递归的方法去做,发现时间超时无法通过所有测试,因为使用递归会有max( O(2^m), (2^n) )的时间复杂度,代码如下

class Solution 
{ 
public: 
    int myfind(int a, int b, int m, int n){ 
        if(a==m)return 1; 
        if(b==n)return 1; 
        return myfind(a,b+1,m,n)+myfind(a+1,b,m,n); 
} 
int uniquePaths(int m, int n) { 
    return myfind(1,1,m,n); 
    } 
};
方法二

使用动态规划可以保存遍历过的结点的值,降低时间复杂度,使用动态规划的时间复杂度是O(m*n)。 使用动态规划有五个步骤,

  • 确定dp数组及下标含义
  • 确定递推公式
  • 初始化dp数组
  • 确定遍历顺序
  • 举例推导dp数组

结合方法一,想一想可以知道dp[i][j]表示从出发位置到(i, j)处的方法数目。我把dp数组设为m行n列的数组,并且设出发位置是(0,0),然后把dp[0][j]都初始化为1,dp[i][0]也初始化为1。 经过试验,可以从前往后遍历。代码如下:

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