面试题9:斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
(n<=39)
思路:
1.递归,会有很多重复的结点,时间复杂度以n的指数方式递增,所以不可采取
2.为了避免重复计算结点,可以从头开始计算,即f(0),f(1),f(2),f(3)……f(n)
class Solution {
public:
int Fibonacci(int n) {
int result[2]={0,1};
if(n<2)
return result[n];
int fibNMinusOne=0;
int fibNMinusTwo=1;
int fibN=0;
for(int i=2;i<=n;i++){
fibN=fibNMinusOne+fibNMinusTwo;
fibNMinusOne=fibNMinusTwo;
fibNMinusTwo=fibN;
}
return fibN;
}
};
跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
f(1)=1;
f(2)=f(2-1)+f(2-2)=1+1=2;
f(3)=f(3-1)+f(3-2)=2+1=3;
…….
f(n)=f(n-1)+f(n-2);
class Solution {
public:
int jumpFloor(int number) {
if(number==1 || number==2)
return number;
int jump0=1;
int jump1=2;
int jumpN=0;
for(int i=3;i<=number;++i){
jumpN=jump0+jump1;
jump0=jump1;
jump1=jumpN;
}
return jumpN;
}
};
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法.
f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-n); //第一步跳一级或者第一步跳两级或者。。。跳n级
f(n-1)=f((n-1)-1)+f((n-1)-2)+…+f((n-1)-(n-1)); //可以带入第一个式子
同理
…….
f(2)=f(2-1)+f(2-2)=1+1=2; //带入第一个式子
f(1)=f(1-1)=1; //带入第一个式子
f(0)=1; //带入第一个式子
可以得到
f(n)=2^m[f(n-m-1)+…+f(0)] //n-m-1=1,m=n-2
=2^(n-2)[f(1)+f(0)]
2^(n-1)
class Solution {
public:
int jumpFloorII(int number) {
if(number<=0)
return -1;
else if(number==1)
return 1;
else return 2*jumpFloorII(number-1);
}
};