题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
时间限制:1秒 空间限制:32768K 热度指数:318412
本题知识点: 递归
思路
依旧是斐波那契数列的变形。
2*N的大矩形,和N个2*1的小矩形。
接下来,我们需要考虑的是递归的几种情形:
1、target <= 0 ,return 0;
(很多人认为这里应该是return 1,但是我不认同,因为target < =0 ,对于计算机来说,应该是一种异常情况)
2、target = 1,大矩形为2*1,小矩形只有 1 种摆法,return 1;
3、target = 2, 大矩形为2*2,小矩形有2中摆法,return 2;
4、target = N,此时分为两步走:
1)第一次竖着摆一个小矩形,那么摆放的方法总共有 F(target - 1)种摆法;
2)第一次横着摆一个小矩形,那么摆放的方法总共有 F(target - 2)种摆法;
解释一下:为啥是F(target - 2),因为只要第一块小矩形是横着摆放,那么下面的位置也就确定了。
======》》》
参考代码
public class Solution {
public int RectCover(int target) {
if (target < 0) {
return 0;
}
if (target == 1) {
return 1;
} else if(target == 2) {
return 2;
} else {
return RectCover(target -1) + RectCover(target - 2);
}
}
}