leetcode--爬楼梯
題目:給定一個(gè)樓梯的臺(tái)階數(shù),你可以一次跳一個(gè)臺(tái)階也可以跳兩個(gè)臺(tái)階,那么在給定的n個(gè)臺(tái)階時(shí)會(huì)有多少種跳法可以到達(dá)臺(tái)階的頂部。
其中1<=n<=45;
大家先好好想一想,找一找它的規(guī)律,然后完成下面的代碼:
int climbStairs(int n){
}
思路:這道題或許很多的同學(xué)會(huì)想到使用遞歸來(lái)實(shí)現(xiàn),但會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題就是超時(shí)了,哈哈哈確實(shí)會(huì)超時(shí),為什么會(huì)超時(shí)我一會(huì)再說(shuō),先講解題思路。
來(lái)分析不同的臺(tái)階數(shù)n有多少種跳法。
n=1,第一種跳法:先一步一步的來(lái),先走一步看是否可以到達(dá),發(fā)現(xiàn)可以即可完成。
n=2,第一種跳法:一步一步的來(lái),先走一步看是否可以到達(dá),發(fā)現(xiàn)不行,剩下的1個(gè)臺(tái)階還沒(méi)走,剩下的臺(tái)階又有集中跳法,發(fā)現(xiàn)只有一種,直接走一步即可完成;第二種跳法:這次先走兩步,看剩下多少個(gè)臺(tái)階,剩下的臺(tái)階數(shù)又可以有多少鐘跳法,發(fā)現(xiàn)沒(méi)有臺(tái)階了,那就是完成了。
n=3,第一種跳法:先走一步,看剩下還有多少個(gè)臺(tái)階沒(méi)走,n-1=2,還剩下兩個(gè)臺(tái)階沒(méi)走,剩下的兩個(gè)臺(tái)階又有多少種跳法呢,前面已經(jīng)分析了是2種,所以臺(tái)階為3的先走一步有兩種走法,也就是1->1->1,->2;第二種跳法:先走兩步看剩下還有多少個(gè)臺(tái)階,n-2=1,還剩下一個(gè)臺(tái)階,剩下的一個(gè)臺(tái)階有多少種跳法,在前面也分析了是1種,也就是說(shuō)臺(tái)階數(shù)為3的只有1種跳法,即2->1.
下面的分析亦是如此,大家可以自己去分析,分析種大家有沒(méi)有發(fā)現(xiàn)說(shuō)明問(wèn)題或者現(xiàn)象。或許很多朋友會(huì)發(fā)現(xiàn)這跟斐波那契數(shù)列很像,是的,其實(shí)就是它。還發(fā)現(xiàn)多加一個(gè)臺(tái)階數(shù)只需要將它的前兩個(gè)和前一個(gè)臺(tái)階數(shù)的跳法相加即可,這個(gè)大家應(yīng)該可以理解吧,也就是臺(tái)階數(shù)為n,n-1就是先走一步的情況,n-1個(gè)臺(tái)階數(shù)又有多少種跳法;n-2是先走2步的情況,n-2個(gè)臺(tái)階數(shù)又有多少種跳法。
法案1:遞歸法(但會(huì)超時(shí))
很簡(jiǎn)單吧,相信大家都能看的懂,遞歸首先就是找到它的規(guī)律,之后確定它的遞歸循環(huán)停止的條件,最后就是遞歸函數(shù)怎么去實(shí)現(xiàn)。
現(xiàn)在就來(lái)說(shuō)一說(shuō)使用遞歸為什么會(huì)超時(shí)吧。
?
時(shí)間復(fù)雜度就是遞歸需要循環(huán)多少次,2^0+2^1+2^2+.....+2^(n-1)=2^n-1;當(dāng)n=10是,2^10=1024,為了方便講解,2^10~=1000(千級(jí)),2^20~=1000*1000=1000000(百萬(wàn)級(jí)),2^30~=1000000000(十億級(jí)),
2^40~=1000000000000(萬(wàn)億級(jí))。電腦一般一秒鐘可以處理十億個(gè)數(shù)據(jù)
這是計(jì)算n=40的斐波那契數(shù)列所需要的時(shí)間。如果再繼續(xù)往上計(jì)算,時(shí)間是相當(dāng)大的,甚至無(wú)法計(jì)算出來(lái)直到地球毀滅都計(jì)算不出來(lái)。
所以大家明白它為什么會(huì)超時(shí)了吧。
方案2:用空間換時(shí)間
?
其實(shí)也不是很復(fù)雜是吧。
?
總結(jié)
以上是生活随笔為你收集整理的leetcode--爬楼梯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 管理系统页面布局 html,25 个精美
- 下一篇: 简析“正向代理”与“反向代理”