【剑指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 };

 

posted @ 2022-11-19 17:34  啊原来是这样呀  阅读(29)  评论(0编辑  收藏  举报