刚开始想递归解决,但超时了(Time Limit Exceeded),因为会有重复的计算。
class Solution {
public:
int uniquePaths(int m, int n) {
if(m==1&&n==1) return 1;
if(m==0||n==0) return 0;
return uniquePaths(m-1,n)+uniquePaths(m,n-1);
}
};
开一个mat[m][n]的数组,mat[i][j] = mat[i-1][j] + mat[i][j-1],空间 时间 复杂度O(m*n)。
class Solution {
public:
int uniquePaths(int m, int n) {
int i,j;
vector<vector<int>> mat(m, vector<int>(n,1));//初始化一个m*n且值为1的矩阵
for(i = 1; i < m; ++i)
for(j = 1; j < n; ++j)
mat[i][j] = mat[i-1][j] + mat[i][j-1];
return mat[m-1][n-1];
}
};
用滚动数组,即只用arr[n],空间复杂度可降为O(n),时间复杂度并不会改变。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> arr(n,1);//初始化一个长为n且值为1的数组
for(int i = 1; i < m; ++i)
for(int j = 1; j < n; ++j)
arr[j] += arr[j-1];
return arr[n-1];
}
};
直接计算C(m-1,m+n-2),题目说m、n最大100,单独计算(m+n-2)!和(m-1)!可能会超过范围。可以分子分母先相除,再累成,最后再取整。结果也通过了,但是运行时间没有变,为什么。。。
class Solution {
public:
int uniquePaths(int m, int n) {
double out = 1.00;
for(int i = m-1; i>=1; --i)
out *= (m+n-2-(m-1-i))/(double)i;
return (int)(out+0.5);
}
};