今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭 ‍

7.斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39。

来了,经典的斐波那契数列,基本上面试的时候有很大概率问到它。一个解决方法还不够,一定要讲出来很多种解决方法才行 ,这里也讲一下它的几种实现方法~

方法1:暴力递归法

当看到斐波那契,这给出的条件,就这?完美递归条件,一拍脑门6行代码出现了:

class Solution:

def Fibonacci(self, n):

# write code here

if n == 0:

return 0

if n == 1 :

return 1

else:

return self.Fibonacci(n-2) + self.Fibonacci(n-1)

开心两秒后:

这个原因比较好想,因为直接递归导致了重复计算,我们可以看计算F(4)的过程:

F(0) = 0

F(1) = 1

F(2) = F(0) + F(1)

F(3) = F(1) + F(2)

= F(1) + F(0) + F(1)

F(4) = F(2) + F(3)

= F(0) + F(1) + F(1) + F(0) + F(1)

可以看到,计算F(4)时需要F(2) 与 F(3)相加,但是计算F(3)时已经计算过F(2)的值,所以这里计算了两次F(2)。重复的计算增大了时间复杂度!

方法2:数组存储法

由于上一个方法没有记住之前算过的值,这个方法可以考虑把之前算过的所有值都存到一个数组里,这样计算F(n)的时候直接取前两项和即可!用空间换时间~

class Solution:

def Fibonacci(self, n):

res = [0,1,1,2] # res用于存储斐波那契数列前n项

while len(res) <= n: # 如果第n项不在这个序列中 de 时候

res.append(res[-1] + res[-2]) # 不断求前面的每一项,存到res里,直到n项也求出来

return res[n]

方法3:俩数存储法(迭代)

聪明的同学已经看出来了,F(n)既然只需要F(n-1)和F(n-2),就不用那么多空间存储前面的每一项了!用俩数存储不就完事了?很好!找到了一个新的优化思路!

这里用两个数,a和b表示斐波那契数列的相邻两项,a在前b在后,while的每一次循环都更新a和b的值,直到更新到第n项。

class Solution:

def Fibonacci(self, n):

# write code here

if n == 0:

return 0

if n == 1:

return 1

a, b = 0, 1

while n > 1:

a, b = b, a+b

n -= 1

return b

方法4:矩阵求解法

这个方法非常简单粗暴!2x2的矩阵[[1,1],[1,0]],它的n次幂的结果,最右下角的位置元素就是斐波那契数列的第n项!是不是很神奇也很好记住~ 我们可以演算一下!

最右下角红色的标记数字就是斐波那契数列的第n项~

import numpy as np

def Fibonacci( n):

if n==0:

return 0

if n==1:

return 1

else:

Matrix = np.matrix('1 1;1 0')

return pow(Matrix, n+1)[1, 1]

道理是这样,但是牛客网系统里这样写找不到numpy,所以放上我自己跑结果:

斐波那契数列就在这告一段落啦~ 如果有其它方法我会更新的!!

8.跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

剑指offer的千层套路来了!看到这个问题,有没有一种莫名的熟悉感?

假设只有1个台阶,那就跳1个,只有一种方法, f(1) = 1;

假设只有2个台阶,那就跳1个*2次,或者2个*1次,有两种方法 f(2) = 2;

假设只有3个台阶,如果就跳1个,剩下两个台阶,跳法数是f(3-1)。如果跳2个,剩下1个台阶,跳法数是f(3-2);

假设有n个台阶,如果先跳1个,就会剩下f(n-1)个跳法,如果先跳2个,就会剩下f(n-2)个跳法,所以f(n) = f(n-1)+f(n-2)!

激动的心颤抖的手,这就是斐波那契数列换了层皮啊!!需要注意一点,这个台阶有n个,而n势必大于1,由于f(1)=1, f(2)=2,可以看出数列是从第3项开始计算的~ Fib = [0,1,1,2,...]

上面的代码随便挑一种方法就可以啦~

class Solution:

def jumpFloor(self, n):

# write code here

if n == 1:

return 1

if n == 2:

return 2

else:

a , b = 1, 2

while n > 2:

a, b = b , a+b

n -= 1

return b

9.变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

这题乍一看和上一题有相似,但是当归纳几个的时候发现还是不一样:

假设只有1个台阶,那就跳1个,只有一种方法, f(1) = 1;

假设只有2个台阶,那就跳1个*2次,或者2个*1次,有两种方法 f(2) = 2;

假设只有3个台阶,跳法有4种:1,1,1

1,2

2,1

3

假设有4个台阶,跳法有8种:1,1,1,1

1,2,1

1,1,2

2,1,1

2,2

1,3

3,1

4

1,2,4,8....突然想到,难道是2的n-1次方规律?

class Solution:

def jumpFloorII(self, number):

# write code here

return pow(2,number-1)

Accept来得猝不及防,甚至有些心虚~

有一个讲解拨云见日:除了最后一个台阶一定要站上去,从1到n-1个台阶都可以选择跳or不跳,所以一共有2^(n-1)种跳法。我咋就想不出来这么优美的解释?

10.矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:一个官方优美的图示

这个乍一看还是找规律的问题

n=1,有1种覆盖法;

n=2,有2种覆盖,=或者||;

n=3,有3种覆盖法,|=, =|, |||;

n=4,有5种覆盖法,||||, |=|, ||=, =||,==;小朋友你是否有很多问号?

我绝倒,这难道又是斐波那契数列?这次的数列是1,2,3,5,...,也是从第3项开始的,这次要考虑n=0的情况:

def rectCover(self, n):

# write code here

if n == 0:

return 0

if n == 1:

return 1

if n == 2:

return 2

else:

a , b = 1,2

while n > 2:

a, b = b , a+b

n -= 1

return b

那么问题来了,这个规律是怎么得到的呢~?

丑陋图示再次上线!当按照情况1覆盖时,剩下f(n-1)种覆盖可能;

当按照情况2覆盖时,由于下面自动只有1种可能,所以剩下f(n-2)种覆盖可能。所以:

f(n) = f(n-1) + f(n-2)

这就是今天的更新啦~明天见!(如果有任何问题欢迎在评论区/私信一起探讨~)

顺便附上之前的更新:嘿我头发呢:剑指offer系列python实现 日更(二)​zhuanlan.zhihu.com嘿我头发呢:剑指offer系列python实现 日更(一)​zhuanlan.zhihu.com

剑指offer python实现_剑指offer系列python实现 日更(三)相关推荐

  1. python输入三个整数_#python输入一个序列,其中包含表示年,月,日的三个整数,判断这个日期是当年的第几?#...

    python ,获取当前时刻,要求格式为:年月日,时分 am或pm >>> import time >>> print time.strftime("%Y ...

  2. windows10安装python环境_在windows10下安装python(配置环境变量),Windows10

    建议使用:anaconda(环境管理和包管理)+Pycharm (强大的IDE开发工具) python环境变量设置: window系统高级设置-> 系统环境变量里 变量名: PYTHONPATH ...

  3. python练习_如何使用Logzero在Python中练习记录

    python练习 Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 an ...

  4. latex附录中放python代码_在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  5. ruby和python比较_为什么说Ruby比Python容易阅读

    这是一篇充满偏见的语言战争文章,是一场无意义的锤子和锤子的比拼.语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个语言都无法回避的. 不屑语言战争的人可以轻松无视此文. 1.字符串格式化 ...

  6. 温度转换的python程序_人生苦短,请用Python!

    想必大家听过这么一句话: "人生苦短,我用Python!" 其实这句关于python的流行梗的原话是: Life is short. You need Python. --布鲁斯· ...

  7. python 切片_知乎问答之 Python 切片整理

    知乎问答之 Python 切片 这是一个知乎问答的补充.原问题是python中字符串 s[ : -1]是什么意思?,当时回答的内容只是对问题本身的简单回答,对 Python 切片中的重要信息是有所忽略 ...

  8. anaconda虚拟环境python升级_使用Anaconda虚拟环境管理Python版本

    1 引言 在前几篇博文中介绍过virtualenv.virtualenvwrapper等几个虚拟环境管理工具,本篇要介绍的anaconda也有很强大的虚拟环境管理功能,甚至相比virtualenv.v ...

  9. 应届生offer长什么样_你的offer长什么样? 拿到offer就是被录取了吗?

    原标题:你的offer长什么样? 拿到offer就是被录取了吗? 我们普遍认为的是:只要大学发了录取offer ,那么就一定是能够入学的.然而,事情没有那么简单.通常情况下,offer是录取的意思,但 ...

最新文章

  1. 谷歌又发钱了!给全员发1600美元,包括外包和实习生!还宣布将无限期居家办公!...
  2. Zotero科研文献管理 - 将PDF文件同步到Google Driver中,不同电脑无缝使用
  3. python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...
  4. Everyday a English
  5. 【IDEA忽略文件Settings设置】
  6. Android开发六 电话拔号器
  7. vsftpd.conf配置范例
  8. 【c# 学习笔记】所有类的父类:System.object
  9. 串行口通信c语言代码,问一下单片机串行口通信用c语言实现的问题
  10. C语言目录文件操作补充
  11. 假如在1996年,微软、IBM、苹果你会投资谁?
  12. python标准库math中用来计算平方根的函数是_Python程序设计的复习题资料合集免费下载...
  13. 口算题自动生成小工具
  14. 基于AC自动机的表白墙解析工具
  15. 狐狸找兔子(java 版)
  16. 将 ERP 与 PPM 系统集成的 5 个理由
  17. 大数据平台运维之Hbase
  18. 【Scala笔记——道】Scala 循环遍历 for详解
  19. 相机标定—标定图片拍摄规范(附棋盘图)
  20. 考研复试计算机网络篇

热门文章

  1. python创建数组并运行_python-Cython中从现有数组和变量创建新数组...
  2. Linux下用户、组、权限操作
  3. 撩课-Web大前端每天5道面试题-Day35
  4. 高仿真机器人助力临床医学发展
  5. istanbul —— JavaScript 代码覆盖率检查工具
  6. Python基础之补充1
  7. Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
  8. 《Cisco交换机配置与管理完全手册》(第二版)前言和目录
  9. 5月第二周全球五大顶级域名总量新增10.5万个
  10. ThinkPHP5框架接入阿里云短信最新版(原大鱼)的方法