斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
法一:存储下前面计算的结果,节约计算时间
运行时间:4ms
占用内存:484k
class Solution {
private:
map<int,int> cache;
public:
int Fibonacci(int n)
{
cache_init();
return Fibonacci_2(n);
}
void cache_init()
{
cache.insert(pair<int, int>(0, 0));
cache.insert(map<int, int>::value_type(1, 1));
}
long long Fibonacci_1(int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return Fibonacci_1(n-1)+Fibonacci_1(n-2);
}
long long Fibonacci_2(int n) {
long long tmp;
if (!cache.count(n))
{
tmp = Fibonacci_2(n - 1) + Fibonacci_2(n - 2);
cache[n] = tmp;
}
else
{
tmp = cache[n];
}
return tmp;
}
};
法二:
从下往上递归计算,即由f(0),f(1)推算 f(n).在不断向上增加。
青蛙跳台阶:
和前一题一样:
运行时间:523ms
占用内存:472k
class Solution {
public:
int jumpFloor(int number) {
if(number==0)
return 0;
else if(number==1)
return 1;
else if(number==2)
return 2;
return jumpFloor(number - 1) + jumpFloor(number - 2);
}
};
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解法:数学归纳法可证明 f(n)=pow(2,n-1);
class Solution {
public:
int jumpFloorII(int number) {
return number > 1 ? pow(2, number - 1) : 1;
}
};
矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
竖着放时,右边还剩下2n-1 的大矩形,横着放时,必须上下各放一个21 的矩形,因此右边还剩下2*n-2 个大矩形,所以本质还是斐波那契数列。