当你的才华还撑不起你的野心时,你应该静下心去学习 。 |
---|
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方法?
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
示例
解题思路
假设f [n]表示2*n大矩阵的方法数。
如果你下用数学归纳法,先从简单的n=1、2、3开始计算,可以得出:f[n] = f[n-1] + f[n-2],初始条件f[1] = 1, f[2] =2
是不是感觉简单的斐波那契数列做了三天?
复杂度分析:
时间复杂度 O(N) : 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) 。
空间复杂度 O(1) : 几个标志变量使用常数大小的额外空间。
参考代码
Java版本
public class Solution {
public int RectCover(int target) {
// 被覆盖的目标矩形的形状: 2*n
// 每次新增加的一列,(1)如果竖着放对应的情况与 target为 n-1 时相同;
// (2如果横着放,对应的情况与 target 为 n-2 时相同。
if(target <=2){
return target;
}else{
return RectCover(target-1) + RectCover(target-2);
}
}
}
CPP版本
int rectCover(int n) {
if (n==0 || n==1 || n==2) return n;
int a = 1, b = 2, c;
for (int i=3; i<=n; ++i) {
c = a + b;
a = b;
b = c;
}
return c;
}
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍 |
---|