题目
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
How many possible unique paths are there?
1 最朴素的想法是使用递归,只要没有越界,就继续往下
class Solution{
public:
int result;
int M;
int N;
int uniquePaths(int m,int n){
if (m < 1 || n < 1)
return 0;
this->M = m;
this->N = n;
result = 0;
fun(1,1);
return result;
}
void fun(int m,int n){
if (m == M && n == N){
result++;
//cout<<m<<" "<<n<<endl;
return ;
}
if (m+1 <= M)
fun(m+1,n);
//cout<<"d"<<endl;
if (n+1 <= N)
fun(m,n+1);
}
};
不过在网上看到更好地递归方法,从Finish点进行回溯
int uniquePaths(int m,int n){
if (m == 1 || n == 1)
return 1;
return uniquePaths(m-1,n)+uniquePaths(m,n-1);
}
递归的方法在LeetCode上会超时
2 动态规划
对于(i,j)进行分析,到其的路径数目应该为(i-1,j) 和(i,j)的数目之和,这样就能找到状态转移公式v[i][j] = v[i-1][j] + v[i][j-1],时间复杂度为(m*n),空间复杂度(m*n)
int uniquePaths(int m,int n){
if (m < 1 || n < 1)
return 0;
vector<vector<int> > v(m,vector<int>(n,1));
for (int i = 1; i < m;i++){
for (int j = 1; j < n; j++){
v[i][j] = v[i-1][j] + v[i][j-1];
}
}
return v[m-1][n-1];
}
上面的更新公式可以进行简化,对每一层进行更新,这样v[j] 就为上面一个点,v[j-1]就为左边的一个点
int uniquePaths(int m,int n){
if (m < 1 || n < 1)
return 0;
vector<int> v(n,1);
for (int i = 1; i < m ; i++)
for (int j = 1; j < n;j++){
v[j] += v[j-1];
}
return v[n-1];
}