给定一个M*N的格子或棋盘,求走法总数
1.题目
给定一个n*m的格子或棋盘,问从左上角走到右下角的走法总数(每次只能向右或向下移动一个方格边长的距离。
2.例子
输入:7 5
输出:792
3.解析
不管怎么走,最终都是要走 m+n 步。
4.递归求法,时间复杂度O(2^n)
private int totalMethod(int n, int m){
if (n == 0 && m == 0){
return 0;
}
if (n == 0 || m == 0){
return 1;
}
return totalMethod(n-1, m) + totalMethod(n, m-1);
}
5.非递归求法,时间复杂度O(n)
其实就是一个排列组合计算,可以用排列组合公式来进行求值。C(n+m,n)下项为n+m,上项为n。
要注意的就是阶乘算起来容易过大,int接收不了的时候可以及时换成double来接收。
private int totalMethod2(int n, int m) {
int sum = 0;
int sum1 = 1;
int sum2 = 1;
if (n >= m){
for (int i = n+1; i <= (m+n); i++) {
sum1 = sum1 * i;
}
for (int i = 1; i <= m; i++) {
sum2 = sum2 * i;
}
}else {
for (int i = m+1; i <= (m+n); i++) {
sum1 = sum1 * i;
}
for (int i = 1; i <= n; i++) {
sum2 = sum2 * i;
}
}
sum = sum1 / sum2;
return sum;
}