【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),如是,便不会出现重复求解的部分。
【解法及注释】
方法一:“递归”求解(会超时)
方法二:“顺序”求解
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; } };
相关文章推荐
- 调用sort时,出现invaild operator<错误
- LeetCode 217. Contains Duplicate
- LeetCode 256. Paint House(房子涂色)
- 死循环问题窥视系统main函数初始化之前操作
- int main(int argc, char *argv[])主函数参数
- 《NPS Training》学习分享
- HDU 3264 Open-air shopping malls [相交圆面积+二分查找]【计算几何】
- LeetCode Climbing Stairs
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings __ greedy and Bucket_sort
- (hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
- hdu 1039 Easier Done Than Said?
- leetcode:Contains Duplicate
- 阐述线程状态之间的关系
- Smail语法
- LeetCode之11---Container With Most Water
- 5.jenkins使用Email Extension Plugin插件配置邮件通知
- LeetCode之11---Container With Most Water
- Gradle project sync failed. Please fix your project and try again解决方案
- Logstash1.5 发邮件报警
- flask框架配置email问题汇总,包括163邮箱,qq邮箱,gmail等国内外邮箱