题目难度:入门
题目描述:
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足以下条件的数列:- 数据范围:1 ≤ n ≤ 40
- 要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法
- 输入描述:一个正整数n
- 返回值描述:输出一个正整数。
示例一:
输入:4
返回值:3
说明:根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。
思路一:递归
提交结果:答案正确 运行时间:205ms 占用内存:460KB
时间复杂度:O(2)
class Solution { public: int Fibonacci(int n) { if (n > 0 && n <= 2) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); } };
思路二:记忆化搜索
时间复杂度:O(n)
提交结果:答案正确 运行时间:4ms 占用内存:512KBclass Solution { public: int m[50] {0}; int Fibonacci(int n) { if(n <= 2) m[1] = m[2] = 1; if(m[n] != 0) return m[n]; else { m[n] = Fibonacci(n-1) + Fibonacci(n-2); return m[n]; } } };
思路三:动态规划
时间复杂度:O(n)
提交结果:答案正确 运行时间:4ms 占用内存:408KBclass Solution { public: int dp[50]{0}; int Fibonacci(int n) { dp[1] = dp[2] = 1; for (int i = 3; i <= n; ++i) dp[i] = dp[i-1] + dp[i-2]; return dp[n]; } };
滚动数组优化;
提交结果:答案正确 运行时间:3ms 占用内存:436KBclass Solution { public: int Fibonacci(int n) { int a = 1, b = 1, c = 1; for (int i = 3; i <= n; ++i) c = a + b, a = b, b = c; return c; } };
😘😘😘😘😘😘😘😘😘😘😘😘😘