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