思路一:递归法。会超时。
代码如下:
class Solution {
int x[]={0,1};
int y[]={1,0};
int num=0;
public int uniquePaths(int m, int n) {
des(0,0,m-1,n-1);
return num;
}
public void des(int now_x,int now_y,int to_x,int to_y){
if(now_x==to_x&&now_y==to_y){
num++;
return ;
}
if(now_x>to_x||now_y>to_y){
return;
}
for(int i=0;i<2;i++){
des(now_x+x[i],now_y+y[i],to_x,to_y);
}
}
}
思路2:动态规划。我们知道到达当前位置的路径一共有两条,来自左侧和来自上侧。于是我们可以将到达之前路径的数量记录下来,这样后续要用的时候就不用再次运算了。
public class Solution {
public int uniquePaths(int m, int n) {
//本题解法为动态规划
//状态转移方程f[i][j] = f[i-1][j] + f[i][j-1];
//f[i][j]的值即为路径的数量
int[][] f = new int[m][n];
for(int i = 0; i < m ; i++)//第一列赋值为1
f[i][0] = 1;
for(int i = 0; i < n; i++)//第一行赋值为1
f[0][i] = 1;
for(int i = 1; i < m ; i++)
for(int j = 1; j < n ; j++){
f[i][j] = f[i-1][j] + f[i][j-1];
}
return f[m-1][n-1];//返回结果值
}
}