08 圖解劍指Offer 青蛙跳臺階 Java題解
題目鏈接
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
題解:
思路: 斐波那契額數列問題,此題前n項和公式 f(n) = f(n - 1) + f(n -2) (n>=3)
注意此題 target = 0 結果爲0, target = 1 結果爲 1 ,target = 2 結果爲2 與普通斐波那契額數列不同,n從3開始。
根據公式可以用遞歸解決此類問題,但是太耗費時間不推薦,遞歸的思想是重複的解決子問題。
故採用記憶優化的算法,將遞歸子問題的結果存入hashMap中,就可以避免重複計算子問題的結果。計算f(n) 需要計算f(n -1) f(n- 2) ,f(n -1) 和 f(n -2)的計算也要以此類推。
又因爲f(n) = f(n -1) + f(n - 2) 故最後只需要三個變量a,b,sum,遍歷數列,在依次將和改爲下一個和,即可實現。sum = a +b a = b b = sum。 最後 返回 a即可
圖解:
代碼:
public class Solution {
public int JumpFloor(int target) {
if(target == 0 || target == 1) return target;
int a = 1, b = 2, sum;
for(int i = 2;i < target; i++) {
sum = a + b;
a = b;
b = sum;
}
return b;
}
}
複雜度
空間複雜度: 空間複雜度爲O(1) 三個int型空間。
最壞時間複雜度: 遍歷時間複雜度O(n)