一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3
输出: 28
class Solution {
public int uniquePaths(int m, int n) {
int[][] array=new int[n][m];
for(int i=0;i<n;i++) array[i][0]=1;//array[0][0]也需要设置1,比如m=n=1
for(int j=1;j<m;j++) array[0][j]=1;
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
array[i][j]=array[i-1][j]+array[i][j-1];
}
}
return array[n-1][m-1];
}
}
//空间复杂度降低
class Solution {
public int uniquePaths(int m, int n) {
int[] dp=new int[m];
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=1;j<m;j++)
dp[j]+=dp[j-1];
}
return dp[m-1];
}
}
使用大数类就不会溢出了
import java.math.BigInteger;
class Solution {
public int uniquePaths(int m, int n) {
int temp=m;
m=Math.max(m, n);
n=Math.min(temp, n);
m=m+n-2;
n=n-1;
BigInteger up=new BigInteger("1");
for(int i=1;i<=n;i++){
up=up.multiply(new BigInteger(m+""));
m--;
}
BigInteger down=new BigInteger(1+"");
for(int i=1;i<=n;i++){
down=down.multiply(new BigInteger(i+""));
}
int ans=Integer.valueOf(up.divide(down).toString());
return ans;
}
}
//一边乘,一边除也不会溢出
import java.math.BigInteger;
class Solution {
//一个组合问题,直接计算C(m+n-2,m-1)即可。
public int uniquePaths(int m, int n) {
int N=m+n-2;
int M=m<n?m-1:n-1;
//计算 C(N,M)
//根据:C(N,M)=C(N,M-1)*M/(N-M+1);
long ans=1;
for(int i=1;i<=M;i++)
ans=ans*(N-i+1)/i;
//一边乘,一边除
return (int)ans;
}
}