1.题目
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
2.我的题解
设2xn
的矩形用2x1
的小矩形覆盖有F(n)
种方法,分析最后一行被覆盖的方式,可能是横向的,也可能是纵向的,
- 横向:最后一行已经被覆盖,方法数等同于
F(n-1)
- 纵向:最后两行已经被覆盖,方法数等同于
F(n-2)
- 结果:
F(n)=F(n-1)+F(n-2),F(1)=1,F(2)=2
嗨,这不就是斐波那契数列吗!参见:剑指 offer 斐波那契数列
n=1 | n=2 | n=3 | n=4 | |
---|---|---|---|---|
横向 | ![]() | ![]() | ![]() | ![]() |
纵向 | 无 | ![]() | ![]() | ![]() |
方法数 | 1 | 2 | 3 | 5 |
class Solution {
public:
int rectCover(int number) {
if(number<=0)return 0;
return Fibonacci(number);
}
int Fibonacci(int n) {
int a=1,b=1;
while(n-->0){
b=a+b;
a=b-a;
}
return a;
}
};