08 圖解劍指Offer 青蛙跳臺階 Java題解

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章