题目:
吐槽:可以通过数学分析得出计算公式。表达出公式就可以A掉这个题。
代码
/**
*
* 得出计算公式C(m+n-2,Math.min(m-1,n-1)),m+n-2是总的要走的步数,Math.min(m-1,n-1)是往一个方向要走的步数(我们选择最小的那个方向)。
* @param m
* @param n
* @return
*/
public int uniquePaths(int m, int n) {
int count = m+n-2;
int index = m>n?n-1:m-1;
long sum = 1;
long sum2 = 1;
for(int i = count ;i>count-index;i--){
sum = sum*i;
}
for(int j = 1;j<=index;j++){
sum2 = sum2*j;
}
return (int) (sum/sum2);
}
动态规划版本
/**
* 动态规划,通过二维数组,写出已知的项得出后续项的逻辑。
* 1)首先可以写出当m == 1和 n==1的时候,行走的方案是1,将相关数组填充好。
* 2)然后再写result[2][2]你会发现,result[m][n] = result[m-1][n] + result[m][n-1].
* 3)把整个数组填满,最后result[m][n]就是最后的结果
* @param m
* @param n
* @return
*/
public static int uniquePaths(int m, int n) {
int[][] result = new int[m+1][n+1];
//1.填写初始的已知结果的数组内容
for(int i = 1;i<result[1].length;i++){
result[1][i] = 1;
}
for(int i = 1;i<result.length;i++){
result[i][1] = 1;
}
//2.计算整个数据的结果
for(int i = 2;i<result.length;i++){
for(int j = 2;j<result[i].length;j++){
result[i][j] = result[i-1][j]+result[i][j-1];
}
}
//3.result[m][n]就是结果
return result[m][n];
}