题目描述:
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
做了半天,就是运行不起来,最后根据结果输出,百度了一下这个数字,发现居然是斐波那契数列中的数,然后根据规律一看,答案果然是斐波那契数列,开始想复杂了,坑爹
上开始写的代码,数超过了int的最大范围,运行不起来
class Solution {
public:
static int fun(int a,int b)
{
if(b==0)
return 1;
long long bigNum=a;
int index=1;
for(int i=1;i<b;i++)
{
bigNum=bigNum*(a-i);
index=index*(i+1);
}
return bigNum/index;
}
int climbStairs(int n) {
int index = n%2;
int num = n/2;
int sum = 0;
for(int i=0;i<=num;i++)
{
if((i*2+index)<(num-i))
{
sum=sum+fun(i*2+index+num-i,index+i*2);
}
else
{
sum=sum+fun(i*2+index+num-i,num-i);
}
}
return sum;
}
};
为什么是
斐波那契数列呢,原因是这样的,如果有n个台阶,那么就等于n-1个台阶走一步或是n-2个台阶走两步,所以是斐波那契数列
class Solution {
public:
int climbStairs(int n) {
if(n<=2)
return n;
else
{
int *step=new int[n];
step[0]=1;
step[1]=2;
for(int i=2;i<n;i++)
{
step[i]=step[i-1]+step[i-2];
}
return step[n-1];
}
}
};