「剑指Offer [Python] 」系列博文,「转载」思路详细易懂的、python语言的众大神博文,加之对各方资料进行「整理 & 汇总」,「学习 & 对比」多种思路(i.e. 暴力解法 vs 快速解法)。
今天是第8题 —— 跳台阶。
今天可厉害了,把 「融会贯通」 展现的淋漓尽致。
看一看,我如何把「跳台阶」联系到「斐波那契数列」,又举一反三到「网易2018实习生招聘笔试题」的吧~
☁️ 「今日大神」
- goddaniel (剑指offer:斐波那契数列(Python))
- mzx1317557721 (《跳台阶 与 矩形覆盖 为啥都是斐波那契数列》
❤️ 「更多题目」
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
一、「跳台阶」 = 「斐波那契数列」 ?
- 思路
- 什么是斐波那契数列?
- 跳台阶的定义?
3. 实质
「跳台阶」是初始条件不同但通式相同的「斐波那契数列」。
- Python 实现
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
l = [1, 1]
while number >= len(l):
l.append(l[-1] + l[-2])
return l[number]
或
def jumpFloor(self, number):
list = [1,1]
while number > 0:
list[0],list[1] = list[1],list[0]+list[1]
number -= 1
return list[0]
斐波那契数列的Python实现,可参考 《剑指Offer [Python] | 7 斐波那契数列》。
二、「跳台阶」 = 「铺瓷砖」?
「斐波那契数列」=「跳台阶」=「铺瓷砖」???
- 思路
我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2 * n的大矩形,总共有多少种方法?
解释:
横放一组,即横放两个,所以还剩下f(n-2)种放法;
竖放一个,还剩下f(n-1)种放法。
- Python 实现
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
l = [0, 1, 2]
while number >= len(l):
l.append(l[-1] + l[-2])
return l[number]
三、举一反三
真题 ——「网易2018实习生招聘笔试题-数据分析实习生」第19题
用1 * 3的瓷砖密铺3 * 20的地板有几种方式?
- 思路
假设用 1 * 3 的瓷砖密铺 3 * n 的地板。
「Step1」
横放一组,即横放3个,还剩下f(n-3)种放法;
竖放一个,还剩下f(n-1)种放法;
所以通项公式 —— f(n) = f(n-1) + f(n-3)
「Step2」确定初始值
f(0)=0
f(1)=1
f(2)=1
f(3)=2
- Python 实现
def fun(n):
l = [0, 1, 1, 2]
while n >= len(l) :
l.append(l[-1] + l[-3])
return l[n]
- 答案
一点感概
「斐波那契数列」打通了「跳台阶」和「铺瓷砖」,这道题真是很过瘾了。