剑指offer算法题
递归 斐波那契数列
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
题目分析
如图可以看出,最后一块小矩形的摆放位置只有情形一和情形二两种,所以可以得出这个题依然是求斐波那契数列,做好n=0,n=1,n=2时的边界判断即可。
java代码如下:
直接递归
public int RectCover(int target) {
if(target <=0){
return 0 ;
}else if(target ==1){
return 1;
}else if(target ==2){
return 2;
}else{
return RectCover(target -1 )+RectCover(target-2);
}
}
迭代法,用num1和num2保存计算过程中的结果,并复用。
public int RectCover(int target) {
if(target <=0){
return 0 ;
}else if(target ==1){
return 1;
}else if(target ==2){
return 2;
}else{
int num1 = 1;
int num2 = 2;
int current = 0;
for(int i = 3 ; i <= target ; i++){
current = num1 + num2;
num1 = num2 ;
num2 = current ;
}
return current ;
}
}