题意:
用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?
方法一:
动态规划
思路:找规律:n=1时,种类数是1;n=2时,种类数是2;n=3时,种类数是3;.....得到状态转换函数:当前项的值等于前两项之和。
特例:n=0时,种类数是0。
class Solution { public: int rectCover(int number) { if(number==0||number==1||number==2) return number; int x=1,y=2,z; for(int i=3;i<=number;i++){//本项等于前两项之和 z=x+y;//求和 x=y;//更新 y=z; } return z; } };
时间复杂度:空间复杂度:
方法二:
记忆化递归
思路:当前项的值等于前两项之和。因此,递归函数为:f(n)=f(n-1)+f(n-2).
class Solution { public: int a[40]={0}; int rectCover(int number) { if(number==0||number==1||number==2)//递归结束条件 return number; if(a[number])//记忆化搜索 return a[number]; return a[number]=rectCover(number-1)+rectCover(number-2);//当前项的值等于前两项之和 } };
时间复杂度:空间复杂度: