LeetCode10 1 斐波那契數列

2021-10-10 06:20:24 字數 1765 閱讀 4902

題目:輸入乙個整數 ,求斐波那契數列的第 n項。(斐波那契數列每一項的值是其前兩項的和)

思路1:暴力法

思路2:記憶化搜尋

開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。

總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。

思路3:遞推

開乙個大陣列,記錄每個數的值。用迴圈遞推計算。

總共計算 n 個狀態,所以時間複雜度是 o(n)。

開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。

總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。

思路4:矩陣運算+快速冪

先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。

首先定義 xn=[an,an-1] x1=[a1 a0]

a=[1 1

1 0]

則有xn=xn-1*a

xn=x1*a^(n-1)

xn向量的第乙個元素即為an

c++實現如下。

/*

題目:輸入乙個整數 ,求斐波那契數列的第 n項。(斐波那契數列每一項的值是其前兩項的和)

假定從0開始,第0項為0。(n<=39)

*/#include#includeusing namespace std;

//思路1:暴力法

class solution1

return a;

}};//思路2:記憶化搜尋

//開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。

//總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。

class solution2

return a;

}};//思路3:遞推

//開乙個大陣列,記錄每個數的值。用迴圈遞推計算。

//總共計算 n 個狀態,所以時間複雜度是 o(n)。

//開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。

//總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。

class solution3

return v[n];

}};//思路4:矩陣運算+快速冪

//先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。

//首先定義 xn=[an,an-1] x1=[a1 a0]

//a=[1 1

// 1 0]

//則有xn=xn-1*a

//xn=x1*a^(n-1)

//xn向量的第乙個元素即為an

class solution4 , };

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

}} for (int i = 0; i < 2; i++)

}} int fibonacci(int n) ;

int res[2][2] = , };//xn矩陣

int t[2][2] = , };//t為底數矩陣 n為冪數

long long k = n;

while (k)

int c[2] = ;

//與x1乘

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

}return c[0];

}};void main()

10 1 斐波那契數列

nowcoder 求斐波那契數列的第 n 項,n 39。如果使用遞迴求解,會重複計算一些子問題。例如,計算 f 4 需要計算 f 3 和 f 2 計算 f 3 需要計算 f 2 和 f 1 可以看到 f 2 被重複計算了。遞迴是將乙個問題劃分成多個子問題求解,動態規劃也是如此,但是動態規劃會把子問題...

LeetCode 面試題10 1 斐波那契數列

原解答在這兒 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 10000000...

LeetCode 斐波那契查詢(Python版)

斐波那契數列 fibonacci 又稱 分割數列,指的是這樣乙個數列 1,1,2,3,5,8,13,21,在數學上,斐波那契被遞迴方法如下定義 f 1 1 f 2 1 f n f n 1 f n 2 n 2 該數列越往後,相鄰的兩個數的比值越趨於 比例值 0.618 斐波那契查詢就是在二分法查詢的基...