题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路如下:
- 当第一次横着覆盖时,覆盖方法为f(n-2);
- 当第一次竖着覆盖时,覆盖方法为f(n-1);
- 因此f(n)=f(n-1)+f(n-2);
- 当n=1时,只有1种覆盖方法,当n=2时,有2种覆盖方法。
- 此题最终得出的仍然是一个斐波那契数列。
- n=1, f(n)=1
n=2, f(n)=2
n>2,且为整数, f(n)=f(n-1)+f(n-2)
package com.jianzhioffer;
public class RectCover {
public static void main(String[] args){
int res = rectCover(15);
System.out.println(res);
res = rectCoverByFor(15);
System.out.println(res);
}
// 递归
public static 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);
}
// for循环
public static int rectCoverByFor(int target){
if(target<=2)
return target;
int[] num = new int[target];
num[0] = 1;
num[1] = 2;
for(int i=2;i<target;i++){
num[i] = num[i-1] + num[i-2];
}
return num[target-1];
}
}