code1:用动态规划 Dynamic Programming 来解,可以维护一个二维数组 dp,其中 dp[i][j] 表示到当前位置不同的走法的个数,然后可以得到状态转移方程为: dp[i][j] = dp[i - 1][j] + dp[i][j - 1],这里为了节省空间,使用一维数组 dp,一行一行的刷新也可以
class Solution {
public int uniquePaths(int m, int n) {
int[] dp=new int[n];
for(int i=0;i<n;i++)
dp[i]=1;
for(int i=1;i<m ;++i)
for(int j=1;j<n;j++)
dp[j] +=dp[j-1];
return dp[n-1];
}
}
code2:采用i递归的思想,但是时间超时
class Solution {
public int uniquePaths(int m, int n) {
return helper(1,1,m,n);
}
public int helper(int row,int col,int m,int n){
if(row==m && col==n)
return 1;
if(row > m || col>n)
return 0;
return helper(row+1,col,m,n)+helper(row,col+1,m,n);
}
}
code3:数学方法,组合问题,机器人总共走m+n-2步,其中m-1步往下走,n-1步往右走,本质上就是一个组合问题,也就是从m+n-2个不同元素中每次取出m-1个元素的组合数。根据组合的计算公式
注意:dom和dedom如果不是double,而是用int,那么会很容易越界,因为这是一个阶乘,所以大家在面试中讨论这种方法要注意和提及越界的问题。
public int uniquePaths(int m, int n) {
double dom = 1;
double dedom = 1;
int small = m<n? m-1:n-1;
int big = m<n? n-1:m-1;
for(int i=1;i<=small;i++)
{
dedom *= i;
dom *= small+big+1-i;
}
return (int)(dom/dedom);
}
参考博客:https://blog.csdn.net/linhuanmars/article/details/22126357