1,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)
思路:
斐波那契数列:0,1,1,2,3,5,8.。。。。。。
经典解法
int Fibonacci(int n)
{
if(n<=0)
return 0;
else if(n==1)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
不足:会计算重复的值,会随着n的增大 时间复杂度会降低
改进思路:
把求n时把前两项保留下来。求n+1时 保留n-1和n 依次类推。时间复杂度为O(n)
class Solution {
public:
int Fibonacci(int n) {
int result[2]={0,1};
if(n<2)
return result[n];
int num1=0;
int num2=1;
int ret=0;
for(int i=2;i<=n;i++)
{
ret=num1+num2;
num1=num2;
num2=ret;
}
return ret;
}
};
2,我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:斐波那契数列变换
n为0时:返回0
n为1时:返回1
n为2时:返回2
为n时:假设n为8 一个2*1放在左边放法有两种 一种是竖着 则还有f(7)种,横着放 另一个必须横着放 所以f(6)。即f(8)=f(6)+f(7)
class Solution {
public:
int rectCover(int number) {
if(number<=0)
return 0;
else if(number==1)
return 1;
else if(number==2)
return 2;
else
return rectCover(number-2)+rectCover(number-1);
}
};
3,跳台阶问题:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
思路:
n==1时:只有一种跳法
n==2时:有两种跳法 一次跳一级 跳两次,一次跳两级 跳一次
n>2时:有f(n-1)+f(n-2)种方式
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);
}
};
4,变态台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法
思路:
n==1:1种
n==2:f(2-1)+f(2-2)
n==3:f(3-1)+f(3-2)+f(3-3)
n==n:f(n-1)+f(n-2)+f(n-3)........+f(n-n)
通过归纳:f(n)=2^(n-1)
class Solution {
public:
int jumpFloorII(int number) {
if(number<=0){
return 0;
}
return 1<<(number-1);
}
};
总结:
这种递归问题,首先从0 1 2分析起找到规律。