沈阳设计培训网站建设百度网站分析
题目:509. 斐波那契数
难度:简单
斐波那契数 (通常用 F(n)
表示)形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n
,请计算 F(n)
。
示例 1:
输入:n = 2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
一、模式识别:动态规划
递推公式直接都给你了。。。
五部曲:
1.动规数组意义:题目本身
2.递推公式:直接就有
3.初始化:这里有个重要的点
4.遍历顺序:本题常规,根据递推公式可知是从前往后
5.举例:较简单,这里省略
二、代码实现
这几种实现方式背后的代码逻辑相同,但各有优劣
1.缓存从0到n的F
该方法可读性较强,耗时低,但占空间较高
class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0] * (n + 1)dp[1] = 1for i in range(2, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]
- 时间复杂度:O(n)
- 空间复杂度:O(n)
耗时:0ms
2.只缓存两个F
该方法可读性较弱,但耗时和占空间都较低
class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0, 1]for i in range(2, n + 1):res = dp[0] + dp[1]dp[0], dp[1] = dp[1], resreturn dp[1]
- 时间复杂度:O(n)
- 空间复杂度:O(1)
耗时:0ms
3.递归
该方法可读性较弱,但耗时较高
class Solution:def fib(self, n: int) -> int:if n <= 1:return nreturn self.fib(n - 1) + self.fib(n - 2)
- 时间复杂度:O(n)
- 空间复杂度:O(1)
耗时:20ms
三、TIP
本题需要注意初始化,不然就会写出这样的代码:
class Solution:def fib(self, n: int) -> int:dp = [0] * (n + 1)dp[1] = 1for i in range(2, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]
然后就会这样😄:
IndexError: list assignment index out of range ~~^^^ dp[1] = 1 Line 4 in fib (Solution.py) ^^^^^^^^^^^^^^^^^^^^^^^ ret = Solution().fib(param_1) Line 32 in _driver (Solution.py) _driver() Line 47 in <module> (Solution.py)
最后执行的输入
n =
0