5.3打卡:劍指 offer兩題:斐波那階數列/跳臺階

斐波那階數列

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0,第1項是1)。

n<=39

思路:

其實我們可以發現每次就用到了最近的兩個數,所以我們可以只存儲最近的兩個數

  • sum 存儲第 n 項的值
  • one 存儲第 n-1 項的值
  • two 存儲第 n-2 項的值
class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        int sum = 0;
        int one = 1;
        int two = 0;
        for (int i = 2; i <= n; i ++)//必須得<=n
        {
            sum = two + one;
            two = one;
            one = sum;
        }
        return sum;
    }
};

跳臺階

題目描述

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

思路:

參考:https://www.nowcoder.com/questionTerminal/8c82a5b80378478f9484d87d1c5f12a4?answerType=1&f=discussion
本質上還是斐波那契數列,所以迭代也可以求

當成 dp 問題來想的話:首先分析問題,它最終解是由前面的解累積起來的解,如何縮小問題的規模?

首先可知,第一階有隻能一步,一種;,第二階可以兩次一步、一次兩步兩種

  • 若樓梯階級 n = 3
    • 跳 2 步到 3:剩下的是第一步沒跳,起始跳到第一步只有一種
    • 跳 1 步到 3:剩下的是第二步沒跳,起始跳到第二步有兩種

通過分類討論,問題規模就減少了:

  • 若樓梯階級 n = n
    • 跳 2 步到 n:剩下的是第 n - 2 步沒跳,起始跳到第 n - 2 步設它爲 pre2 種
    • 跳 1 步到 n:剩下的是第 n - 1 步沒跳,起始跳到第 n - 1 步設它爲 pre1 種

同時可以發現第 n 階的解法,只要用到 n - 1 和 n - 2 階是多少,其他的不用考慮,因此用兩個變量臨時存下來即可

dp(i) = dp(i-2) + dp(i-1)

class Solution {
public:
    int jumpFloor(int target) {
        if (target <= 2) return target;
        int pre2 = 1, pre1 = 2, sum = 0;
        for (int i = 3; i <= target; i ++)
        {
            sum = pre2 + pre1;
            pre2 = pre1;
            pre1 = sum;
        }
        return sum;
    }
};

 

 

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