您的位置:首页 > 大数据 > 人工智能

【LeetCode】70. Climbing Stairs

2016-04-09 10:08 513 查看
70. Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

【分析】

题意:爬一个有n级阶梯的楼梯,每一步只能上一级或者两级,问一共有多少种不同爬楼方式。
这个题很简单,本质上就是一个“斐波拉契数列”,我们欲到达第n级台阶,上一步需要到达第n-1级或者n-2级,那么达到第n级的方式总数就等于到达第n-1级和第n-2级方式的和:F(n)=F(n-1)+F(n-2),n>2;F(1)=1;F(2)=2;很明显,这就是斐波拉契数列。
对于斐波拉契数列的求解,教科书上一般采用的是“递归”求解,程序虽然简洁,但是效率并不高,并且当n比较大时,递归方式用到的“”存储结构可能溢出。效率不高的原因在于重复计算过多,比如欲求F(n)=F(n-1)+F(n-2),需递归求F(n-1)=F(n-2)+F(n-3)和F(n-2)=F(n-3)+F(n-4),明显,F(n-2)、F(n-3)被重复求解,依次递推,会出现大量的重复求解部分,极大的降低了效率。因此,我们可对此算法进行改进,采用顺序求解方式:即,从自底向上求解,F(1),F(2),F(3),F(4),...,F(n),如是,便不会出现重复求解的部分。

【解法及注释】

方法一:“递归”求解(会超时)

class Solution {
public:
int climbStairs(int n) {

int F1=1;
int F2=2;

if(n<=0)return 0;
else if(n==1)return 1;
else if(n==2)return 2;
else if(n>2)
{
return climbStairs(n-1)+climbStairs(n-2);
}
}
};


方法二:“顺序”求解

class Solution {
public:
int climbStairs(int n) {

int F1=1;
int F2=2;
int Fn=0;
if(n<=0)return 0;
else if(n==1)return 1;
else if(n==2)return 2;
else if(n>2)
{
for(int i=3;i<=n;i++)
{
Fn=F1+F2;
F1=F2;
F2=Fn;
}
}
return Fn;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: