题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
解题思路(递归):
逆向分析:小矩形可以横着放或竖着放,
所以f(n)可以是2*(n-1)的矩形加一个竖着放的2*1的矩形或2*(n-2)的矩形加2横着放的,
即f(n)=f(n-1)+f(n-2)
递归结束已知条件,f(1)=1,f(2)=2
代码实现:
public class Solution {
/*
解题思路:递归
逆向分析:小矩形可以横着放或竖着放,
所以f(n)可以是2*(n-1)的矩形加一个竖着放的2*1的矩形或2*(n-2)的矩形加2横着放的,
即f(n)=f(n-1)+f(n-2)
递归结束已知条件,f(1)=1,f(2)=2
*/
public int RectCover(int target) {
if(target <= 2){
return target;
}else{
return RectCover(target-1)+RectCover(target-2);
}
}
}
效率:
解题思路2:
类似于斐波那契数列,非递归解法
代码实现:
class Solution {
/*
类似于斐波那契数列,非递归解法
*/
public:
int rectCover(int number) {
int f1 = 1,f2 = 2,f;
if(number <= 2){
return number;
}
for(int i=3;i<=number;i++){
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
};
效率: