1. 题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
2.思路和方法
思路:(下面说到的x*y的矩形,x是宽,y是长,固定一下方便理解)假设一个2×n的矩形,那么放第一个小矩形有两种放法:放2×1的或者放1×2的,如果是放1×2的意味着在它的下面也只能放一个1×2的,组成一个2×2正方形。那么我们就可以分为两种结构,第一种是2×1的矩形,第二种是2×2的正方形。宽都是2不用考虑,长有1和2两种选择,那么可以将问题转换为:长为n的线段由长为1和长为2的线段组成,共有多少种组成方法。
长为n的线段组成方法=(第一步放长为1后剩下的线段的组成方法)+(第一步放长为2后剩下的线段的组成方法),即 f(n)=f(n-1)+f(n-2);1,2,3,5,8 …。就是一个类似斐波那契数列。
3.C++核心代码
3.1 非递归方法
1 class Solution { 2 public: 3 int rectCover(int number) { 4 if(number<=2) 5 return number; 6 int f1 = 1; 7 int f2 = 2; 8 int result = 0; 9 for(int i = 3; i <= number; i++){ 10 result = f1 + f2; 11 f1 = f2; 12 f2 = result; 13 } 14 return result; 15 } 16 };
3.2 递归方法
递归代码量少,但是时间复杂度高。对于现在存储空间很大的环境下,应该节约时间。
1 class Solution { 2 public: 3 int rectCover(int number) { 4 if(number<=3) 5 return number; 6 return rectCover(number-2)+rectCover(number-1); 7 } 8 };
参考资料
https://blog.csdn.net/JMasker/article/details/86771720