7、斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39
计算出一个数组长度为39的斐波那契数组
根据斐波那契规则,第n个数等于n-1和n-2之和,第0项是0,第一项是1。
0 1 1 2 3 5 8 11 19 30…
上述内容可以存储到一个长度为39的数组中,需要第几个斐波那契数,返回该数下标的数组值即可。
class Solution {
public:
int Fibonacci(int n) {
int F[39];
F[0]=0,F[1]=1;
for(int i=2;i<=39;i++)
{
F[i]=F[i-1]+F[i-2];
}
return F[n];
}
};
改用三个变量,只求第n个斐波那契数
第一种思路用到了数组,占用空间较多。因此,可以改进为只用三个变量。
class Solution {
public:
int Fibonacci(int n) {
if(n<2)return n;
else if(n==2)return 1;
int n1=1,n2=1;
for(int i=3;i<=n;i++)
{
int tmp=n2;
n2=n1+n2;
n1=tmp;
}
return n2;
}
};
8、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路分析
跳上n阶台阶可能是由n-1跳一步到n,也可能是由n-2阶跳2阶到n阶。那么调到n阶的跳法=跳到n-1阶的跳法+n-2阶跳法。应该是下面这样一个数组。
1 2 3 5 8 11 19…
与第七题的差别:1)因为并没有说明台阶数,所以只能用第二种方法。2)前一个数组从0开始,
class Solution {
public:
int jumpFloor(int number) {
if(number<3)return number;
int n1=1,n2=2;
for(int i=3;i<=number;i++)
{
int old2=n2;
n2=n1+n2;
n1=old2;
}
return n2;
}
};
9、变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路分析
如上图所示,第n阶台阶f(n)=f(1)+f(2)+f(3)+…+f(n-1)+1,f(n-1)=f(1)+f(2)+f(3)+…f(n-2)+1,所以f(n)=2f(n-1)。观察得出数列:1、2、4、8、16…,归纳出f(n)=2^(n-1)。
代码一
class Solution {
public:
int jumpFloorII(int number) {
if(number<2)return 1;
else
{
int start=1;
for(int i=2;i<=number;i++)
{
start*=2;
}
return start;
}
}
};
代码二
class Solution {
public:
int jumpFloorII(int number) {
return pow(2,number-1);
}
};