剑指offer python实现_剑指offer系列python实现 日更(三)
今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭
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实现 日更(三)相关推荐
- python输入三个整数_#python输入一个序列,其中包含表示年,月,日的三个整数,判断这个日期是当年的第几?#...
python ,获取当前时刻,要求格式为:年月日,时分 am或pm >>> import time >>> print time.strftime("%Y ...
- windows10安装python环境_在windows10下安装python(配置环境变量),Windows10
建议使用:anaconda(环境管理和包管理)+Pycharm (强大的IDE开发工具) python环境变量设置: window系统高级设置-> 系统环境变量里 变量名: PYTHONPATH ...
- python练习_如何使用Logzero在Python中练习记录
python练习 Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 an ...
- latex附录中放python代码_在Latex中插入Python代码
这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...
- ruby和python比较_为什么说Ruby比Python容易阅读
这是一篇充满偏见的语言战争文章,是一场无意义的锤子和锤子的比拼.语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个语言都无法回避的. 不屑语言战争的人可以轻松无视此文. 1.字符串格式化 ...
- 温度转换的python程序_人生苦短,请用Python!
想必大家听过这么一句话: "人生苦短,我用Python!" 其实这句关于python的流行梗的原话是: Life is short. You need Python. --布鲁斯· ...
- python 切片_知乎问答之 Python 切片整理
知乎问答之 Python 切片 这是一个知乎问答的补充.原问题是python中字符串 s[ : -1]是什么意思?,当时回答的内容只是对问题本身的简单回答,对 Python 切片中的重要信息是有所忽略 ...
- anaconda虚拟环境python升级_使用Anaconda虚拟环境管理Python版本
1 引言 在前几篇博文中介绍过virtualenv.virtualenvwrapper等几个虚拟环境管理工具,本篇要介绍的anaconda也有很强大的虚拟环境管理功能,甚至相比virtualenv.v ...
- 应届生offer长什么样_你的offer长什么样? 拿到offer就是被录取了吗?
原标题:你的offer长什么样? 拿到offer就是被录取了吗? 我们普遍认为的是:只要大学发了录取offer ,那么就一定是能够入学的.然而,事情没有那么简单.通常情况下,offer是录取的意思,但 ...
最新文章
- 谷歌又发钱了!给全员发1600美元,包括外包和实习生!还宣布将无限期居家办公!...
- Zotero科研文献管理 - 将PDF文件同步到Google Driver中,不同电脑无缝使用
- python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...
- Everyday a English
- 【IDEA忽略文件Settings设置】
- Android开发六 电话拔号器
- vsftpd.conf配置范例
- 【c# 学习笔记】所有类的父类:System.object
- 串行口通信c语言代码,问一下单片机串行口通信用c语言实现的问题
- C语言目录文件操作补充
- 假如在1996年,微软、IBM、苹果你会投资谁?
- python标准库math中用来计算平方根的函数是_Python程序设计的复习题资料合集免费下载...
- 口算题自动生成小工具
- 基于AC自动机的表白墙解析工具
- 狐狸找兔子(java 版)
- 将 ERP 与 PPM 系统集成的 5 个理由
- 大数据平台运维之Hbase
- 【Scala笔记——道】Scala 循环遍历 for详解
- 相机标定—标定图片拍摄规范(附棋盘图)
- 考研复试计算机网络篇
热门文章
- python创建数组并运行_python-Cython中从现有数组和变量创建新数组...
- Linux下用户、组、权限操作
- 撩课-Web大前端每天5道面试题-Day35
- 高仿真机器人助力临床医学发展
- istanbul —— JavaScript 代码覆盖率检查工具
- Python基础之补充1
- Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- 《Cisco交换机配置与管理完全手册》(第二版)前言和目录
- 5月第二周全球五大顶级域名总量新增10.5万个
- ThinkPHP5框架接入阿里云短信最新版(原大鱼)的方法