题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
分析:
首先想到的就是递归方法,但此时时间复杂度太大,主要原因就是有很多值是重复计算的,因为每一次函数调用都会在栈中分配内存空间,当递归调用的层数太多时就会造成栈溢出。
class Solution {
public:
int Fibonacci(int n)
{
if(n<=1)
return n;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
};
为解决栈溢出问题,我们只需要把计算的值进行储存,下次计算时先查找一下,如果之前已经计算过了,就不用重复计算了。
从下往大计算更加简便:
1.先给出f0=0;f1=1;
2.计算 f2=f1+f0; 储存f2和f1
3.计算f3=f2+f1;储存f3和f2
。。。。。。
最终计算得到fn。
class Solution {
public:
int Fibonacci(int n)
{
if(n<=1)
return n;
long long thefirst =0; //第一个数
long long thesecond=1; //第二个数
long long result=0;
for(int i=2;i<=n;i++)
{
result=thefirst+thesecond;
thefirst=thesecond;
thesecond=result;
}
return result;
}
};
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:我们把n级台阶的跳法看成是f的函数f(n)。则第一次跳1级,剩下n-1级的跳法是f(n-1),第一次跳2级,剩下n-2级的跳法是f(n-2),不难发现
f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2. 这是一个斐波那契数列。
代码:
class Solution {
public:
int jumpFloor(int number) {
if(number<=2)
return number;
long long thefirst =1;
long long thesecond=2;
long long result =0;
for(int i=3;i<=number;i++)
{
result=thefirst+thesecond;
thefirst=thesecond;
thesecond=result;
}
return result;
}
};
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)
。。。。。。。
跳n-1级,剩下1级,则剩下跳法是f(1)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
又因为f(n-1)=f(n-2)+f(n-3)+...+f(1)
所以f(n)=2*f(n-1)
代码:
class Solution {
public:
int jumpFloorII(int number)
{ if(number<=2)
return number;
else
return 2* jumpFloorII(number-1) ;
}
};