问题描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
用第1个小矩形覆盖时,有两种方式:横放或者竖放。横放时,后面的方法还有
f(n−1)
;竖放时后面的方法还有
f(n−2)
。因此n个小矩形组成的大矩形被覆盖的总方法为
f(n)=f(n−1)+f(n−2)
。此处
f(1)=1,f(2)=2
,根据测试用例和输出判断
f(0)=1
。因此该问题也是斐波那契数列。
牛客AC代码:
public class Solution {
public int RectCover(int target) {
if(target <= 0)
return 1;
if(target <= 2)
return target;
int f1 = 1;
int f2 = 2;
int fn = 0;
for(int i = 3; i <= target; i++) {
fn = f1 + f2;
f1 = f2;
f2 = fn;
}
return fn;
}
}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社