Leetcode Hot 100 Problems —— 70. 爬楼梯问题
作者:互联网
爬楼梯
简单描述:
现在有n阶楼梯,每次只能爬一阶或者两阶,
问:一共有多少种走法?
递归解法
递归公式:
f(n)={
1, n=1
2, n=2
f(n-1)+f(n-2), n>3
}
直接递归
比较好理解,将递归公式翻译就行。代码如下:
int climbstair_digui(int n){
if(n==1 || n==2)
return n;
return climbstair_digui(n-1)+climbstair_digui(n-2);
}
高复杂度,时间复杂度O(n^2)
重复计算,因为每一次分支递归都有可能计算前面计算过的!
比如:f6 = f5 + f4, f5 = f4 + f3, f4 = f3 + f2...
解决办法,存储计算结果,以空间换时间。
存储中间结果的递归法
- 使用数组存储:
int already[100010] = {0};
int climbstair_ar(int n){
if(n==1 || n==2)
return n;
if(0 != already[n])
return already[n];
already[n] = climbstair_ar(n-1)+climbstair_ar(n-2);
return already[n];
}
- 使用map存储
#include <map>
map<int,int> almap;
int climbstair_mp(int n){
if(n==1||n==2)
return n;
if(0 != almap.count(n))
return almap[n];
int result = climbstair_mp(n-1)+climbstair_mp(n-2);
almap[n] = result;
return result;
}
以上两种解法时间复杂度约为O(n)!但空间复杂度略高。
使用非递归法——迭代累加
自低向下,由已知累加。
使用两个单独的变量,存储两个可能的累加值
时间复杂度更低,空间复杂度更低!
int climbstair(int n){
if(n==1||n==2)
return n;
int result = 0;
int pre=2;
int prepre=1;
for(int i=3;i<=n;i++){
result = pre + prepre;
prepre = pre;
pre = result;
}
return result;
}
标签:already,return,递归,int,复杂度,Problems,climbstair,Hot,70 来源: https://www.cnblogs.com/ymj68520/p/16058354.html