题目
一、斐波那契数列
时间限制:1秒 空间限制:32768K 热度指数:615828
本题知识点: 递归
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
-
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。--------------百度百科
-
想法很简单解释循环前两个相加等于现在求的,题目知识点写作递归,其实可以用循环
class Solution {
public:
int Fibonacci(int n) {
if (n == 0) return 0;
int j = 1;//第一个斐波那契数
int i = 1;//第二个
while(--n)//直到n减完退出循环
{
i += j;//求Xn+1=Xn-1+Xn
j = i - j;//保存Xn
}
return j;//返回Xn
}
};
二、跳台阶
时间限制:1秒 空间限制:32768K 热度指数:468962
本题知识点: 递归
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
- 同上一道题目,这其实也是一道斐波那契数列的题
- n=1时,f(1) = 1(只跳一格)
- n=2时,f(2) = (直接跳两格)1 + f(1) = 2;
- n=3时,f(3) = (直接跳两格+跳一格)2 + (只跳一格)f(1) = 3;
- n=4时,f(4) = (22)1 + (21+12)3 + (14)1 = 5;
- 最后你会求得规律F(n+1) = F(n) + F(n-1);
- 所以最后可以看成是斐波那契数列
class Solution {
public:
int Fibonacci(int n) {
if (n == 0) return 0;
int j = 1;//第一个斐波那契数
int i = 2;//第二个
while(--n)//直到n减完退出循环
{
i += j;//求Xn+1=Xn-1+Xn
j = i - j;//保存Xn
}
return j;//返回Xn
}
};
三、变态跳台阶
时间限制:1秒 空间限制:32768K 热度指数:378260
本题知识点: 贪心
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 思路
- n=1时,只能跳一级所以是1;F(1) = F(0) = 1
- n=2时,跳两级和跳一级*2所以是2;F(2) = F(1) + F(0)
- n=3时,跳三级,跳两级+跳一级,跳一级*3 = 4; F(3) = F(2) + F(1) + F(0)
- n=4时,跳四级,跳三级+跳一级,跳两级2,跳两级+跳一级2,跳一级+4 = 8;F(4) = F(3) + F(2) + F(1) + F(0)
- F(n) = F(n-1) + F(n-2)+…+F(n-n) = F(0) + F(1) + F(2) + F(3) + … + F(n-1)
- F(n-1)表示n个台阶一次跳1格的次数
- 所以F(n)可以看成是之前的所有元素相加+1得到 可以化为发F(n) = 2^(n-1);
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0)return 0;
return 1<<(number-1);//左移相当于2的n次
}
};