其实就是求(m+n-2)中取(m-1)的组合数
错误方法1:
强行算组合数:当m,n比较大时,数会超出计算机能表示的范围。
class Solution {
public:int uniquePaths(int m, int n) {
/*if(m <= 0 || n <= 0)
return 0;
int a = 1;
for (int i = m; i <= m + n - 2 ; i++ )
{
a = a * i;
}
int b = 1;
for (int i = 1; i <= n - 1 ; i++ )
{
b = b * i;
}
return a/b;
}
};
错误方法2:
递归,会有很多重复的计算,效率低,递归栈大。
计算uniquePaths(m - 1, n) 和 uniquePaths(m, n - 1)都会计算一次uniquePaths(m - 1, n - 1),重复计算。
class Solution {
public:int uniquePaths(int m, int n) {
if(m <= 0 || n <= 0)
return 0;
else if(m == 1 || n == 1)
return 1;
else
{
return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
}
}
};
正确方法:
对错误方法2进行改进,
用动态规划思想,
从后向前分析,用数组a[m][n]存储(i,j)到终点的路径数,
逐行a[i][j]进行赋值,每个a[i][j]只用计算一次
从而消除重复计算
class Solution {
public:int uniquePaths(int m, int n) {
if(m <= 0 || n <= 0)
return 0;
else if(m == 1 || n == 1)
return 1;
//初始化
int a[m][n];
for(int i = 0 ; i < m; i++){
for(int j =0 ; j < n; j++){
a[i][j] = 1;
}
}
//计算
for(int i = 1 ; i < m; i++){
for(int j =1 ; j < n; j++){
a[i][j] = a[i-1][j] + a[i][j-1];
}
}
return a[m-1][n-1];
}
};