1.迭代
这里我们设置一个函数f[i][j]表示从起点到达(i,j)坐标的不同路径数目。
很明显,f[i][j]=f[i-1][j]+f[i][j-1],根据这个我们可以自底向上遍历一遍即逐行遍历。
代码如下所示:
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
vector<vector<int>>dp(m, vector<int>(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];
}
};
这样的空间复杂度很明显是O(mn),时间复杂度是O(mn)
2.递归
我们可以用递归来降低空间复杂度。
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
if(m==1 || n==1){
return 1;
}
return uniquePaths(m-1, n) + uniquePaths(m, n-1);
}
};
3.数学
这个是否能让我们想起高中的时候的排列组合呢?
没错,向下走m-1步,向右走n-1步,我们只要算个组合数就行了即在m+n-2的步中选择m-1个向下走的步。
代码如下所示:
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
long res=1;
for(int i=1;i<n;++i){
res = res * (m + i - 1) / i;
}
return res;
}
};
这里的时间复杂度已经降为O(min{m,n})了,空间复杂度是O(1)
这里的细节是要注意不能写*=,因为m+i-1不一定整除i