题目:给定一个楼梯的台阶数,你可以一次跳一个台阶也可以跳两个台阶,那么在给定的n个台阶时会有多少种跳法可以到达台阶的顶部。
其中1<=n<=45;
大家先好好想一想,找一找它的规律,然后完成下面的代码:
int climbStairs(int n){
}
思路:这道题或许很多的同学会想到使用递归来实现,但会发现一个问题就是超时了,哈哈哈确实会超时,为什么会超时我一会再说,先讲解题思路。
来分析不同的台阶数n有多少种跳法。
n=1,第一种跳法:先一步一步的来,先走一步看是否可以到达,发现可以即可完成。
n=2,第一种跳法:一步一步的来,先走一步看是否可以到达,发现不行,剩下的1个台阶还没走,剩下的台阶又有集中跳法,发现只有一种,直接走一步即可完成;第二种跳法:这次先走两步,看剩下多少个台阶,剩下的台阶数又可以有多少钟跳法,发现没有台阶了,那就是完成了。
n=3,第一种跳法:先走一步,看剩下还有多少个台阶没走,n-1=2,还剩下两个台阶没走,剩下的两个台阶又有多少种跳法呢,前面已经分析了是2种,所以台阶为3的先走一步有两种走法,也就是1->1->1,->2;第二种跳法:先走两步看剩下还有多少个台阶,n-2=1,还剩下一个台阶,剩下的一个台阶有多少种跳法,在前面也分析了是1种,也就是说台阶数为3的只有1种跳法,即2->1.
下面的分析亦是如此,大家可以自己去分析,分析种大家有没有发现说明问题或者现象。或许很多朋友会发现这跟斐波那契数列很像,是的,其实就是它。还发现多加一个台阶数只需要将它的前两个和前一个台阶数的跳法相加即可,这个大家应该可以理解吧,也就是台阶数为n,n-1就是先走一步的情况,n-1个台阶数又有多少种跳法;n-2是先走2步的情况,n-2个台阶数又有多少种跳法。
法案1:递归法(但会超时)
很简单吧,相信大家都能看的懂,递归首先就是找到它的规律,之后确定它的递归循环停止的条件,最后就是递归函数怎么去实现。
现在就来说一说使用递归为什么会超时吧。
时间复杂度就是递归需要循环多少次,2^0+2^1+2^2+.....+2^(n-1)=2^n-1;当n=10是,2^10=1024,为了方便讲解,2^10~=1000(千级),2^20~=1000*1000=1000000(百万级),2^30~=1000000000(十亿级),
2^40~=1000000000000(万亿级)。电脑一般一秒钟可以处理十亿个数据
这是计算n=40的斐波那契数列所需要的时间。如果再继续往上计算,时间是相当大的,甚至无法计算出来直到地球毁灭都计算不出来。
所以大家明白它为什么会超时了吧。
方案2:用空间换时间
其实也不是很复杂是吧。