题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
思路:
根据观察:
n = 1:f(n) = 1
n = 2:f(n) = 2
n = 3:f(n) = 3
n = 4:f(n) = 5
n = 5:f(n) = 8
递归算法
class Solution {
public:
int rectCover(int number) {
if(number < 1)
return 0;
if(number == 1)
return 1;
if(number == 2)
return 2;
return (rectCover(number - 1)+rectCover(number - 2));
}
};
题解:
class Solution {
public:
int rectCover(int number) {
if (number <= 0) {
return number;
}
int f1 = 1;
int f2 = 2;
int f3;
for (int i = 3; i <= number; i++) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
};
时间复杂度o(n),确实比递归求解简单多了。
小结:
求解能不用递归就不用递归解法。