剑指offer中跳台阶,变态跳台阶以及矩形覆盖均是递归类型。递归问题的核心在于找出转移关系,也就是当前项和前一项或是前两项的关系。本文着重点在使用迭代的方法实现递归。
虽然这几道题都没有限定时间复杂度,使用递归均可通过,但是使用迭代的方法可以对其进行优化。
以矩形覆盖为例:
使用递归的方法:
int rectCover(int number) {
int sum,first=1,second=2;
if(number<1)
return 0;
if(number<3)
return number;
sum=rectCover( number-1)+rectCover(number-2);
return sum;
}
耗时638ms,内存592k;
使用迭代的方法:
int rectCover(int number) {
int sum,first=1,second=2;
if(number<1)
return 0;
if(number<3)
return number;
for(int i=3;i<=number;++i)
{
sum=first+second;
first=second;
second=sum;
}
return sum;
}
耗时3ms,内存480K
总结:使用迭代的方法对递归问题进行优化,能够显著的改善时间复杂度,在空间复杂度上性能也有所提升。