劍指offer 9 斐波那契數列

2022-07-20 05:06:13 字數 1468 閱讀 4393

現在要求輸入乙個整數n,輸出斐波那契數列的第n項。

傳統遞迴實現,需要求多個重複子問題。

使用動態規劃,memo記錄,但是,只是用了兩個。

因此改進冬天規劃

普通的動態規劃

int fibonacci(int n)

; for (int i = 2; i <= n; ++i)

return memo[n];

}

使用三個int不停的交換

int fibonacci(int n)

if (n == 1)

int a = 0, b = 1;

int m = 0; //交換用的。

int i;

// 0,1的時候已經輸出了,因此這裡從2開始

for (i = 2; i <= n; i++)

return m;

}

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

分析,f(n)=f(n-1)+f(n-2)

f(i)跳到第i層可能的方法。

f(0)=0

f(1)=1

f(2)=2

f(3)=f(2)+f(1) 也就是說,從f(2)調到f(3),和從f(1)調到f(3)

因此,與斐波那契數列不同之處在於,這個題目是從第三個開始的有地推公式的。

int jumpfloor(int number)

else if (number == 0)

int f1 = 0;

int f2 = 1;

int ret = 0;

for (int i = 1; i <= number; ++i)

return ret;

}

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

同上乙個題,只不過,這次真的需要memo了

int jumpfloorii(int number)

}return memo[number];

}

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

f(0)=0

f(1)=1

f(2)=f(0)+f(1)

在於怎麼鋪,只有乙個的時候,只有一種鋪法。當連個2*1的時候,就有橫豎兩種了。因此,嗯,借用了上乙個的狀態。

int rectcover(int number)

else if (number == 0)

int f1 = 0;

int f2 = 1;

int ret = 0;

for (int i = 1; i <= number; ++i)

return ret;

}

劍指Offer9斐波那契數列

寫乙個函式,輸入n,求斐波那契數列的第n項。f 0 0 f 1 1 f n f n 1 f n 2 方法1 遞迴實現 long long fibonacci unsigned int n 方法2 迴圈實現,並且不用陣列來記錄每乙個值,只要記錄最後兩個變數就可以 long long fibonacci...

劍指offer 9 斐波那契數列

求斐波那契數列的第 n 項,n 39。思路解析 兩種方式 1.利用公式求取每乙個f n 的值,並利用乙個n 1的陣列來儲存每乙個f n 的值,此方法空間複雜度為o n 2.利用兩個變數儲存f n 1 和f n 2 的值,利用公式f n f n 1 f n 2 並不斷更新f n 1 與f n 2 的值...

劍指offer 9 斐波那契數列

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 第一種解法不好 會重複計算很多值,時間複雜度以n的指數方式增長 long fibonacci int n 優化解法 從下往上計算。見解法二 動態規劃問題 class solution return m...