《劍指 Offer (第 2 版)》第 10-1 題:跳臺(tái)階(斐波拉契數(shù)列价说、滾動(dòng)變量)

第 10-1 題:跳臺(tái)階(斐波拉契數(shù)列辆亏、滾動(dòng)變量)

傳送門:AcWing:跳臺(tái)階湃廴危客網(wǎng) online judge 地址褒链,牛客網(wǎng) online judge 地址疑苔。

輸入一個(gè)整數(shù) n 甫匹,求斐波那契數(shù)列的第 n 項(xiàng)。

假定從 0 開始惦费,第 0 項(xiàng)為 0 兵迅。(n \le 39)

樣例:

輸入整數(shù) n=5

返回 5

一只青蛙一次可以跳上 1 級(jí)臺(tái)階薪贫,也可以跳上 2 級(jí)恍箭。求該青蛙跳上一個(gè) n 級(jí)的臺(tái)階總共有多少種跳法。

思路:這題的數(shù)據(jù)范圍很小瞧省,我們直接模擬即可扯夭。當(dāng)數(shù)據(jù)范圍很大時(shí),就需要采用其他方式了鞍匾,可以參考求解斐波那契數(shù)列的若干方法交洗。寫成動(dòng)態(tài)規(guī)劃,如果使用遞歸橡淑,一定要加上緩存构拳,否則會(huì)重復(fù)求解子問題,導(dǎo)致效率低下梁棠。

  • 題目背景是斐波拉契數(shù)列置森。
  • 在實(shí)現(xiàn)的時(shí)候思考如何節(jié)約空間,其實(shí)使用常數(shù)級(jí)別的輔助空間就可以了符糊。

時(shí)間復(fù)雜度:總共需要計(jì)算 n 次凫海,所以時(shí)間復(fù)雜度是 O(n)

Python 代碼1:用兩個(gè)變量滾動(dòng)式往后計(jì)算男娄,a 表示第 n?1 項(xiàng)盐碱,b 表示第 n 項(xiàng)。則令 c=a+b 表示第 n+1 項(xiàng)沪伙,然后讓 ab 順次往后移一位县好。

class Solution(object):
    def Fibonacci(self, n):
        """
        :type n: int
        :rtype: int
        """

        if n == 0:
            return 0
        if n == 1:
            return 1
        a = 0
        b = 1

        while n:
            c = a + b
            # “滾動(dòng)變量”:接下來重新定義 a 和 b
            a = b
            b = c
            n -= 1
        return a

Python 代碼2:Python 語法糖围橡,了解即可

class Solution(object):
    def Fibonacci(self, n):
        """
        :type n: int
        :rtype: int
        """

        if n == 0:
            return 0
        if n == 1:
            return 1
        a = 0
        b = 1

        while n:
            a , b = a + b , a
            n -= 1
        return a

Python 代碼3:

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        a = 0
        b = 1
        
        while n:
            a , b = b , a + b 
            n -= 1
        return b

參考資料:面試官問你斐波那契數(shù)列的時(shí)候不要高興得太早。書上斐波拉契數(shù)列數(shù)列空間更省的寫法缕贡,P76翁授。

Java 代碼:

public class Solution {

    // 1 1 2 3 5 8
    // 0 1 2 3 4 5
    public int Fibonacci(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int fibonacci = solution.Fibonacci(5);
        System.out.println(fibonacci);
    }
}

Java 代碼:

public class Solution {

    // 1 2 3 5 8
    // 1 2 3 4 5
    public int JumpFloor(int target) {
        int n = target;
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

    // i j (i+j)
    // 1 2 3 5
    // 1 2 3 4
    public int JumpFloor1(int target) {
        if (target == 1) {
            return 1;
        }
        int n = target;
        int i = 1;
        int j = 2;
        int temp;
        for (int k = 3; k <= n; k++) {
            temp = j;
            j = i + j;
            i = temp;
        }
        return j;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        for (int i = 1; i < 5; i++) {
            int jumpFloor = solution.JumpFloor1(i);
            System.out.println(jumpFloor);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拣播,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子收擦,更是在濱河造成了極大的恐慌贮配,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞赂,死亡現(xiàn)場離奇詭異泪勒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宴猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門圆存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仇哆,你說我怎么就攤上這事沦辙。” “怎么了讹剔?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵油讯,是天一觀的道長。 經(jīng)常有香客問我延欠,道長陌兑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任衫冻,我火速辦了婚禮诀紊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隅俘。我一直安慰自己邻奠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布为居。 她就那樣靜靜地躺著碌宴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒙畴。 梳的紋絲不亂的頭發(fā)上贰镣,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音膳凝,去河邊找鬼碑隆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹬音,可吹牛的內(nèi)容都是我干的上煤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼著淆,長吁一口氣:“原來是場噩夢啊……” “哼劫狠!你這毒婦竟也來了拴疤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤独泞,失蹤者是張志新(化名)和其女友劉穎呐矾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懦砂,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜒犯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孕惜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧薛。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衫画,靈堂內(nèi)的尸體忽然破棺而出毫炉,到底是詐尸還是另有隱情,我是刑警寧澤削罩,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布瞄勾,位于F島的核電站,受9級(jí)特大地震影響弥激,放射性物質(zhì)發(fā)生泄漏进陡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一微服、第九天 我趴在偏房一處隱蔽的房頂上張望趾疚。 院中可真熱鬧,春花似錦以蕴、人聲如沸糙麦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赡磅。三九已至,卻和暖如春宝与,著一層夾襖步出監(jiān)牢的瞬間焚廊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工习劫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咆瘟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓诽里,卻偏偏與公主長得像搞疗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359