劍指 Offer 10 II 青蛙跳台階問題

2021-10-14 01:50:00 字數 990 閱讀 6211

leetcode 劍指 offer

有 n 個台階,設 n 個台階有 dp[n] 種跳法,分情況:

青蛙跳 1 個台階,剩下的 n-1 個台階有 dp[n-1] 種跳法;

青蛙跳 2 個台階,剩下的 n-2 個台階有 dp[n-2] 種跳法。

由上找到狀態之間的關係:

dp[n] = d[n-1] + dp[n-2]

一直按照這種狀態轉移下去,直到基準 dp[0]=1、dp[1]=1。

1)按照上述形式,可以使用遞迴,即求 dp[n] 就是求 dp[n-1]、dp[n-2]。這裡不展示**了。

2)進一步分析,如 dp[5]=dp[3]+dp[4]、dp[4]=dp[3]+dp[2] …。可以看出,原問題分解為子問題時,出現子問題重複計算。我們可想著用乙個變數儲存以計算過的子問題,於是可以採用帶有備忘錄的遞迴演算法。(**略)。

3)該問題其實符合動態規劃的問題,所以可以採用動態規劃,使用 dp table。使用動態規劃與帶備忘錄的遞迴演算法從時間以及空間複雜度上是相等的。但是可以對動態規劃的空間複雜度進行優化,使其為 o(1)。

優化思路:當前狀態值是最近的兩個狀態值的和,與其他歷史值無關,所以每次只要迭代記錄鄰近兩個狀態值即可。為什麼帶備忘錄的遞迴演算法不能這樣優化,因為遞迴是函式呼叫函式,類似深度優先搜尋原則,只有子問題 dp[n-1] 計算完結果才會執行子問題 dp[n-2] 計算結果。如果不記錄子問題 dp[n-1] 中的多個中間值,子問題 dp[n-2] 就會重複計算。

**如下:

class

solution

// 使用兩個單變數代替狀態陣列。

int pre =1;

int next =1;

int res =0;

for(

int i=

2; i<=n; i++

)return res;

}}

青蛙跳台階(劍指 Offer 10 II)

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 coding utf 8 class solution def jumpfloor self,number write code here a,b 1,2 for i in range...

劍指 Offer 10 II 青蛙跳台階問題

劍指 offer 10 ii.青蛙跳台階問題 乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個 n 級的台階總共有多少種跳法。答案需要取模 1e9 7 1000000007 如計算初始結果為 1000000008,請返回 1。示例 1 輸入 n 2 輸出 2 示例 2 輸入 n 7...

劍指 Offer 10 II 青蛙跳台階問題

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個 n 級的台階總共有多少種跳法。答案需要取模 1e9 7 1000000007 如計算初始結果為 1000000008,請返回 1。示例 1 輸入 n 2 輸出 2 示例 2 輸入 n 7 輸出 21 示例 3 輸入 n 0 輸出 1...