多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【剑指offer】40.斐波那契数列

总目录:

算法之旅导航目录

 

1.问题描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足 f(x)=
{1,当x=1,2;
f(x−1)+f(x−2),当x>2}的数列;
数据范围:1≤n≤40
要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法

 

2.问题分析

 1递归,直接套公式,缺点是时间复杂度比较高;

2记忆搜索法,将前面计算过的内容保存下来下次直接使用;

3动态规划,状态转移方程已经直接给出

4快速幂法,f(x)=f(x-1)+f(x-2),可以看做是一个矩阵[f(x),f(x-1)]=[1,1;1,0]*[f(x-1),f(x-2)]=[1,1;1,0]^n*[f(1),f(0)],用快速幂算出[1,1;1,0]^n即可,快速幂的时间复杂度是O(logn)


3.代码实例

1递归

复制代码
 1 class Solution {
 2   public:
 3     map<int, int> dataSet;
 4     int Fibonacci(int n) {
 5         if (n <= 2) {
 6             return 1;
 7         }
 8 
 9         return Fibonacci(n - 1) + Fibonacci(n - 2);
10     }
11 };
复制代码

 

2记忆搜索法

复制代码
 1 class Solution {
 2   public:
 3     map<int, int> dataSet;
 4     int Fibonacci(int n) {
 5         if (n <= 2) {
 6             return 1;
 7         }
 8 
 9         //直接查表返回
10         if (dataSet.find(n) != dataSet.end()) {
11             return dataSet[n];
12         }
13 
14         dataSet[n] = Fibonacci(n - 1) + Fibonacci(n - 2);
15         return dataSet[n];
16     }
17 };
复制代码

3动态规划法

复制代码
 1 class Solution {
 2 public:
 3     int Fibonacci(int n) {
 4         int a = 1 , b = 1 , c = 1;
 5         for (int i = 3 ; i <= n ; i ++) {
 6             c = a+b , a = b , b = c;
 7         }
 8         return c;
 9     }
10 };
复制代码

 

本文作者:啊原来是这样呀

本文链接:https://www.cnblogs.com/OhOfCourse/p/16906608.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(29)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起