1. 程式人生 > >劍指offer--斐波那契數列-跳臺階-變態跳臺階-矩形覆蓋

劍指offer--斐波那契數列-跳臺階-變態跳臺階-矩形覆蓋

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
n<=39
注:
自己最早是直接用一整個數列,將每一步的資料都儲存了下來,但是這是不必要的。因為只需要用到前兩步的資料,所以只需要用兩個變數將前兩步的資料儲存下來即可。

class Solution {
public:
    int Fibonacci(int n) {
        vector<int> temp={0,1};
        if(n<2)
        {
            return temp[n];
        }
int data_N=0; int data1=0,data2=1; for(int i=2;i<=n;++i) { data_N=data1+data2; data1=data2; data2=data_N; } return data_N; } };

題目描述

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

class Solution
{ public: int jumpFloor(int number) { vector<int> temp={0,1,2}; if(number<=2) { return temp[number]; } int data_N=0; int data1=1,data2=2; for(int i=3;i<=number;++i) { data_N=data1+data2; data1=
data2; data2=data_N; } return data_N; } };

題目描述

一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
注:
這裡需要用一個數列將所有的資料儲存下來。每一步的資料等於之前所有步的資料相加。
並且,這裡把 i = 0 i=0 的情況設為1。因為,從平地(第0階),也是一種可能。

class Solution {
public:
    int jumpFloorII(int number) {
        if(number==0) return 0;
        vector<int> temp={1,1};
        for(int i=2;i<=number;++i)
        {
            auto size=temp.size();
            int sum=0;
            while(size--)
            {
                sum+=temp[size];
            }
            temp.push_back(sum);
        }
        return temp[number];
    }
};

題目描述

我們可以用21的小跳臺階橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

class Solution {
public:
    int rectCover(int number) {
        vector<int> temp={0,1,2};
        if(number<=2)
        {
            return temp[number];
        }
        int data1=1,data2=2;
        int data_N=0;
        for(int i=3;i<=number;++i)
        {
            data_N=data2+data1;
            data1=data2;
            data2=data_N;
        }
        return data_N;
    }
};