题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
//这个问题最后也可以转化为斐波那契数列来思考:
//当大矩形的长度为n时,前两格的覆盖方式有两种,
//第一种是在第一格上竖着放一个小矩形,这样后面的空格的方法就和大矩形长度为n-1时一样;
//第二种是在前两格横着放置两格小矩形,这样后面的空格的放置方法就和大矩形长度为n-2时的一样
//这样递推关系式子为F(n)=F(n-1)+F(n-2)
自己根据递推公式写的代码有两种:
一个是for循环的,运行时间短一些
public class Solution {
public int RectCover(int target) {
//特殊情况预处理
if(target<=0) return 0;
if(target==1) return 1;
if(target==2) return 2;
int[] res=new int[target+1];
res[0]=0;
res[1]=1;
res[2]=2;
for(int i=3; i<=target;i++){
res[i]=res[i-1]+res[i-2];
}
return res[target];
}
}
一个是递归的,运行时间长一些,但简洁
public class Solution {
public int RectCover(int target) {
if(target<=0) return 0;
if(target==1) return 1;
if(target==2) return 2;
return RectCover(target-1)+RectCover(target-2);
}
}