斐波那契数列问题

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分析起找到规律。

猜你喜欢

转载自blog.csdn.net/qq_33436509/article/details/81459178
今日推荐