「剑指Offer [Python] 」系列博文,「转载」思路详细易懂的、python语言的众大神博文,加之对各方资料进行「整理 & 汇总」,「学习 & 对比」多种思路(i.e. 暴力解法 vs 快速解法)。
今天是第7题 —— 斐波那契数列。
「今日份学习大神」
- 作者:goddaniel
- 来源:https://blog.csdn.net/u010005281/article/details/79823515
(好巧,茫茫人海中,昨天《旋转数组的最小数字》也是看对眼了goddaniel的博文。他的博文特点在于,思路多,且各种方法之间有层层深入的关系,此外还会评价各种方法的优缺点,让人理解是如何改进的。我把这个过程,更清晰的体现出来~)
❤️ 「更多题目」
- 题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
一、暴力解法 —— 递归
- 思路
根据斐波那契数列的定义
- Python 实现
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n <= 1:
return n
else:
return self.Fibonacci(n-1) + self.Fibonacci(n-2)
# 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
- 缺点
时间复杂度高,无法通过测试。
二、递推 —— 生成完整的序列
- 思路
后一项加前一项,生成一个完整的斐波那契序列。
- Python 实现
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
l = [0, 1]
while n >= len(l):
l.append(l[-1] + l[-2])
return l[n]
- 优缺点
- 优:时间复杂度降低到O(n),可以通过测试;
- 缺:事实上,斐波那契数列的第n项只与其n-1和n-2项相关,因而没必要生成全部的第0项~第n项的斐波那契数列。
三、递推 —— 更简单的写法
- 思路
递推,但不生成完整的序列,即第0项~第n项中,第n项仅与第n-1项和n-2项有关,其他项可不存储下来。
- Python 实现
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
l = [0 , 1]
while n > 0:
l[0], l[1] = l[1], l[0] + l[1]
n -= 1
return l[0]
- 优点
空间复杂度降低。