面试题10.4(矩形覆盖)
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
知识点
递归,循环
Qiang的思路
对于这道题,小矩形是21的,大矩形是2n的,这就意味是每个小矩形可以竖着放,一次性就把2行给占满了,或者横着放,这样肯定相邻行的也得横着放了。换句话说,如果我们在考虑大矩形的第i列时(此时前i-2列都已放满),我们可以看下第i-1列有没有矩形,如果i-1有,那么第i列只能竖着放一个小矩形,如果没有,那么第i列和第i-1列可以合起来横着放两个小矩形(不能竖着放,竖着放和第i-1列有的情况就一样了)。
基于这个思想,我们发现,当大矩形有n列时,总共的方法数为:
好啊,又是个斐波那契数列。那代码直接就出来了。
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
f=[1,1]
for i in range(2,number+1):
a=f[1]
f[1]=f[1]+f[0]
f[0]=a
return f[1] if number!=0 else 0
至于这个题当n为0时返回0完全是出题人这样规定的,实际认为是1也不是不可,毕竟啥都不放本身就是一种方法嘛。
【面试题10.4(矩形覆盖)】作者原创,如需转载及其他问题请邮箱联系:lwqiang_chn@163.com。
个人网站:https://www.myqiang.top。
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 杜月笙的口才
- Linux下面如何查看tomcat已经使用多少线程
- 皮夹克
- 解读《摩根集团》(1)
- 绘本与写作
- 蓝桥杯试题
- 麦田社群
- 面对苦难——如何化解
- 葱爷说股20190107