题目描述:
我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2xn的大矩形,总共有多少种方法?
解析:将nx2的矩形记为f(n)。用第一个2x1的小矩形去覆盖大矩形的时候有两种选择:竖着去放或者横着去放,当竖着放的时候,右边还剩下(n-1)x2的矩形区域,此情况下的覆盖方法为f(n-1)。当2x1的矩形横着放在左上角的时候,左下角必须横着放一个2x1的小矩形,而在右边还剩下(n-2)x2的区域,这种情况下的覆盖方法为f(n-2)。因此得到f(n)=f(n-1)+f(n-2)。这是一个斐波那契数列。
Java代码实现(递归,比较慢):
public class Solution {
public int RectCover(int target) {
if(target <= 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
while(target > 2){
return RectCover(target-1)+RectCover(target-2);
}
return 0;
}
}
非递归循环方法(更快,效率高):
public class Solution {
public int RectCover(int target) {
int PreOne = 1;
int PreTwo = 0;
int res = 0;
for(int i = 0; i < target; i++){
res = PreOne + PreTwo;
PreTwo = PreOne;
PreOne = res;
}
return res;
}
}