面试题10:斐波那契数列及应用

本文详细解析了斐波那契数列的高效算法实现,通过循环而非递归的方式提高计算效率,并拓展讨论了利用2*1小矩形覆盖2*n大矩形的方法总数问题,采用数组暂存思想避免重复计算。

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

n<=39

考察点:递归和循环的理解。时间复杂度的分析。以及递归问题的拓展。

思路:单纯用递归的话,虽然简介易懂,但是多了很多重复性的运算,所以运算效率低下。考虑用循环解决,从小到大开始,每次暂存结果,为下一次运算作准备。

class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0)
            return 0;
        if (n == 1)
            return 1;
        long long int one = 0;
        long long int two = 1;
        long long int sum = 0;
        for (int i = 2; i <= n; i++)
        {
            sum = one + two;
            one = two;
            two = sum;
        }
        return sum;
    }
};

拓展题目:

题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:还是数组暂存思想,避免递归的深度太大和大量重复计算。

class Solution {
public:
    int rectCover(int number) {
        vector<int> result(number + 1);
        result[0]=0;
        result[1]=1;
        result[2]=2;//初始化开始情况
        for (int i = 3; i <= number; i++)
        {
            result[i] = result[i - 1] + result[i - 2];//递归方程
        }
        return result[number];
    }
};

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值