题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:
- 当n小于1的时候,不需要任何2*1的小矩形去覆盖,返回0
- 当n等于1的时候,只有一种覆盖方法
- 当n等于2的时候,有两种方法
- 当n等于3的时候,有三种方法,粉色部分是在n=2的基础上进行扩充或变形
通过上面三个例子,可以看出n的覆盖方法种类都是对n-1的扩展,我们再来看n=4的情况
仔细观察,不难发现,上面3种方法是在n=3的基础上进行扩充,下面2种方法是在n=2的基础上进行扩充和变形,因此可以得出规律,f(n) = f(n-1) + f(n-2) (n>2),很明显,这又是一个斐波那契数列。
直接看代码:
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);
}
}
public class Solution {
public int RectCover(int target) {
if(target<=0){
return 0;
}
if(target==1){
return 1;
}
if(target==2){
return 2;
}
int[] arr = new int[target+1];
arr[1] = 1;
arr[2] = 2;
for (int i=3; i<=target; i++){
arr[i] = arr[i-1] + arr[i-2];
}
return arr[target];
}
}
public class Solution {
public int RectCover(int target) {
if(target<=0){
return 0;
}
if(target==1){
return 1;
}
if(target==2){
return 2;
}
int fn1 = 1;
int fn2 = 2;
int result = 0;
for(int i=3; i<=target; i++){
result = fn1 + fn2;
fn1 = fn2;
fn2 = result;
}
return result;
}
}