LeetCode 面試題10- I. 斐波那契數(shù)列【劍指Offer】【Easy】【Python】【動態(tài)規(guī)劃】
問題
寫一個函數(shù)际长,輸入 n ,求斐波那契(Fibonacci)數(shù)列的第 n 項兴泥。斐波那契數(shù)列的定義如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契數(shù)列由 0 和 1 開始工育,之后的斐波那契數(shù)就是由之前的兩數(shù)相加而得出。
答案需要取模 1e9+7(1000000007)搓彻,如計算初始結(jié)果為:1000000008如绸,請返回 1。
示例 1:
輸入:n = 2
輸出:1
示例 2:
輸入:n = 5
輸出:5
提示:
0 <= n <= 100
注意:本題與主站 509 題 相同好唯。
思路
動態(tài)規(guī)劃
fib(n) = fib(n - 1) + fib(n - 2)
注意竭沫,fib(n)會越界,所以最好是:
fib(n) % 1000000007 = (fib(n - 1) % 1000000007 + fib(n - 2) % 1000000007) % 1000000007
但是因為 Python 中整形數(shù)字的大小限制取決計算機(jī)的內(nèi)存(可理解為無限大)骑篙,因此可不考慮大數(shù)越界問題。
時間復(fù)雜度: O(n)
空間復(fù)雜度: O(1)
Python3代碼
class Solution:
def fib(self, n: int) -> int:
dp_0, dp_1 = 0, 1
for _ in range(n):
dp_0, dp_1 = dp_1, dp_0 + dp_1
return dp_0 % 1000000007