剑指offer10_矩形覆盖_题解
矩形覆盖
题目描述
我们可以用\(2*1\)的小矩形横着或者竖着去覆盖更大的矩形。请问用\(n\)个\(2*1\)的小矩形无重叠地覆盖一个\(2*n\)的大矩形,总共有多少种方法?
比如\(n=3\)时,\(2*3\)的矩形块有\(3\)种覆盖方法:
示例1
输入
4
返回值
5
分析
方案一:递推
n=1时,显然只有一种方法
n=2时,如图有2种方法
n=3,如图有3中方法
n=4,如图有4种方法。
涂掉最后一级矩阵的时候,可以选择使用横向完成,也可以使用竖向完成,横向涂剩下 \(n - 1\) 阶,竖向涂剩下 \(n - 2\) 阶,可以得出递推方程为
\[f(n)=f(n-1)+f(n-2)\tag{n>2}
\]
\[f(1)=1,f(2)=2
\]
/**
时间复杂度:O(n)
空间复杂度:O(1)
**/
class Solution
{
public:
int rectCover(int number) {
if(number == 1 || number == 2){
return number;
}
int a = 1, b = 2, c;
for(int i = 3; i <= number; i++){
c = a + b;
a = b;
b = c;
}
return c;
}
};