题目描述
// 10. 矩形覆盖
// 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
// 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
// 比如n=3时,2*3的矩形块有3种覆盖方法
题解
// 如果图画出来就明白了,其实还是斐波那契数列问题。
// 要找有多少种方法,而不关心放了多少块,
// 所以其实2*1小矩形有单块竖放和两块横放两种放法,
// 其中横放必须要两块一起横放。明白了这点,那么:
// 当n=1时,需要覆盖面积为2*1,总共有f(1)=1种放法
// 当n=2时,需要覆盖面积为2*2,总共有f(2)=2种放法(两个横放和两个竖放)
// 当n=n时,需要覆盖面积为2*n,第一步可以竖放可以横放,
// 假设第一步是竖放,则还剩下2*(n-1)覆盖面积,有f(n-1)种放法,
// 假设第一步是横放,还剩下2*(n-2)覆盖面积,有f(n-2)种放法,
// 那么总的方法数为所有放法加起来,所以f(n) = f(n-1) + f(n-2)
// 牛客
// 暴力递归法,不推荐
// 运行时间:320ms
// 占用内存:9560k
public class Solution {
public int RectCover(int target) {
if (target <= 2)
return target;
return RectCover(target - 1) + RectCover(target - 2);
}
}
// 运行时间:9ms
// 占用内存:9652k
public class Solution {
public int RectCover(int target) {
if (target <= 2)
return target;
int f = 0;
int prev1 = 1, prev2 = 2;
for (int i = 3; i <= target; i++) {
f = prev1 + prev2;
prev1 = prev2;
prev2 = f;
}
return f;
}
}