题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
不知道为什么,拿到这个题,我觉得好像似曾相识....
难道不是青蛙跳台阶的另一种说法?
分析题目:
首先,2*1或者是2*n,长为2是确定的。
如果横着放,那么长度2被覆盖了,宽度n-1
如果竖着放,长度2只被覆盖了一半,宽度n-2,所以只要是竖着放,必须是两个一起竖着放。
从覆盖的角度,也就是n逐渐减少的过程来看,这里的递推公式应该是:
f(n)=f(n-1)+f(n-2)
所以第一版我用的是递归,AC了。但是时间复杂度和空间复杂度都比较高。
换一个思路,把题目想象成,用小矩形拼凑出大矩形,就是n++的思路,
那么,
f(1)=1
f(2)=2
f(3)=f(2)+f(1)
f(4)=f(3)+f(2)
.....
f(n)=f(n-1)+f(n-2)
这样就可以用for循环来做了。
AC代码如下,23ms:
public class Solution {
public int RectCover(int target) {
if (target <= 0) {
return 0;
}
if (target == 1) {
return 1;
}
if (target == 2) {
return 2;
}
// int sum=RectCover(target-1)+RectCover(target-2);
// return sum;
int first = 1;
int second = 2;
int third = 0;
for(int i = 3; i <= target; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
}