方法一
直接使用递归的方法去做,发现时间超时无法通过所有测试,因为使用递归会有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];
}
};