这题目我一开始想的是排列组合,随着2的个数不同,排列组合的数目不同,但在数据较大计算阶乘的时候发生了溢出,无法通过测试代码
public static int climbStairs(int n) {
int num = 0;
int n1 = n;
int num_2 = -1;
int sum=0;
while(n1 >= 0) {
n1-=2;
num_2++; //2的个数
}
for (int i = 0; i <= num_2; i++) {
num = n-i;
sum = sum + C(num,i);
}
return sum;
}
public static int A(int n, int m)
{
long result = 1;
// 循环m次,如A(6,2)需要循环2次,6*5
for (int i = m; i > 0; i--)
{
result *= n;
n--;// 下一次减一
}
return (int)result;
}
// 求组合数
public static int C(int n, int m)
{
// int denominator=factorial(up);//分母up的阶乘
// 分母
int denominator = A(m, m);// A(6,6)就是求6*5*4*3*2*1,也就是求6的阶乘
// 分子
int numerator = A(n, m);// 分子的排列数
return numerator / denominator;
}
看评论,这题目最巧妙的应该是方法是斐波那契数列排列,也就是使用动态规划方法。
public static int climbStairs2(int n)
{
int pre_1 = 1;
int pre_2 = 2;
int num = 0;
if (n == 1) {
return 1;
}
if (n ==2) {
return 2;
}
for (int i = 22; i < n; i++)
{
num = pre_1 + pre_2;
pre_1 = pre_2;
pre_2 = num;
}
return num;
}