JZ8青蛙跳台階

2021-10-23 15:20:46 字數 1395 閱讀 5677

題目描述

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。

此題和斐波拉契數列做法一樣。也將用三個方法來解決,從入門到會做。

考察知識:遞迴,記憶化搜尋,動態規劃和動態規劃的空間優化

難度:一星

題解題目分析,這是一道經典的遞推題目,你可以想如果青蛙當前在第n級台階上,那它上一步是在**呢?

顯然,由於它可以跳1級台階或者2級台階,所以它上一步必定在第n-1,或者第n-2級台階,也就是說它跳上n級台階的跳法數是跳上n-1和跳上n-2級台階的跳法數之和。

那麼初始條件了,f[0] = f[1] = 1。

所以就變成了:f[n] = f[n-1] + f[n-2], 初始值f[0]=1, f[1]=1,目標求f[n]

看到公式很親切,**秒秒鐘寫完。

public

class

solution

return

jumpfloor

(target-1)

+jumpfloor

(target-2)

;}}

優點,**簡單好寫,缺點:慢,會超時

時間複雜度:o(2^n)

空間複雜度:遞迴棧的空間

拿求f[5] 舉例

通過圖會發現,方法一中,存在很多重複計算,因為為了改進,就把計算過的儲存下來。

那麼用什麼儲存呢?一般會想到map, 但是此處不用牛刀,此處用陣列就好了。

public

class

solution

return jf[target];}

}

時間複雜度在這裡插入**片:o(n), 沒有重複的計算

空間複雜度:o(n)和遞迴棧的空間

雖然方法二可以解決此題了,但是如果想讓空間繼續優化,那就用動態規劃,優化掉遞迴棧空間。

方法二是從上往下遞迴的然後再從下往上回溯的,最後回溯的時候來合併子樹從而求得答案。

那麼動態規劃不同的是,不用遞迴的過程,直接從子樹求得答案。過程是從下往上。

public

class

solution

if(target ==1)

int result =0;

int step1 =1;

int step2 =1;

for(

int i =

2; i <= target; i++

)return result;

}}

時間複雜度:o(n)

空間複雜度:o(n)

青蛙跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。解題思路 1 如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 2 假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 3 總跳法為 f n f n...

青蛙跳台階

之前面試遇到了這種題目,不會,後來搜尋了一下,感覺分析的很好 青蛙跳乙個n階的台階,每次可以跳1階或者2階,求跳完n階y有多少種方法。分析 n 1,f n 1 n 2,f n 2 n 3,f n 3 n 4,f n 5 可以發現 f n f n 1 f n 2 由此也可以推想 比如要跳到第4階樓梯上...

青蛙跳台階

難易程度 中等 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。在不考慮青蛙健康狀況的情況下 求該青蛙跳上乙個n級的台階總共有多少種跳法。思路 在本題的描述中,青蛙的行動只有兩種可能 一次跳乙個台階或者兩個台階,設n階台階的跳法為 f n 如果第一次跳了一階,那麼剩下的n 1階的跳法為f n...