劍指Offer #08 跳臺階(遞推)

題目來源:牛客網-劍指Offer專題
題目地址:跳臺階

題目描述

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

題目解析

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

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

設跳上 ii 級臺階有 f(n)f(n) 種跳法,則它跳上n級的臺階有 f(n)=f(n1)+f(n2)f(n)=f(n-1) + f(n-2) 種跳法。

然後,我們又思考初始(n20n-2\leq0)的情況,跳上1級臺階只有1種跳法,跳上2級臺階有2種跳法,最終我們得到如下的遞推式:

f(n)={1,n=12,n=2f(n1)+f(n2),n>2 f(n)= \begin{cases} 1&, \text{n=1} \\ 2 &,\text{n=2} \\ f(n-1) + f(n-2) &,\text{n>2} \end{cases}
這個遞推式和 FibonacciFibonacci比較相似,這裏就簡單寫常用的兩種實現方式,詳情可以參考上篇博客解法:斐波那契數列(四種解法)

方法一:
面試別寫型遞推版實現,時間複雜度 O(22)O(2^2)

public class Solution {
    public int JumpFloor(int n) {
        if (n == 1) return 1; 
        if (n == 2) return 2;
        return JumpFloor(n - 1) + JumpFloor(n - 2);
    }
}

方法二:
面試推薦型,自底向上型循環求解,時間複雜度爲 O(n)O(n)

public class Solution {
    public int JumpFloor(int target) {
        int a = 1, b = 1;
        for (int i = 1; i < target; i++) {
            a = a + b;
            b = a - b;
        }
        return a;
    }
}

如果本文對你有所幫助,要記得點贊哦~

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