lintcode 第336題斐波那契數列

2021-08-07 06:23:30 字數 2626 閱讀 4321

要求:查詢斐波納契數列中第 n 個數

所謂的斐波納契數列是指:前2個數是 0 和 1 ,第 i 個數是第 i-1 個數和第i-2 個數的和,斐波納契數列的前10個數字是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34 …

樣例給定 1,返回 0

給定 2,返回 1

給定 10,返回 34

第一次想到的方法是使用遞迴,但是遞迴的效率比較低,時間超限,報錯(**執行時間超過了限制,檢查你的時間複雜度。tle通常是由死迴圈造成的,思考一下你的時間複雜度是否是最優的。)在這裡也放上遞迴的**(時間複雜度o(2^n)):

public class solution else if(n==2)else}}

第二種方法就是把遞迴轉化成為for迴圈來寫,這樣的話可以一定程度減少時間的複雜度,遞迴和for迴圈可以看成是兩個互逆的過程。(時間複雜度o(n))總耗時: 2655 ms

public class solution 

return second;

}else

return 0;}}

當然,也可以使用陣列來挨個儲存每乙個值。(時間複雜度o(n))

class solution 

int fib = new int[n];

fib[0] = 0;

fib[1] = 1;

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

return fib[n - 1];}}

還有一種解法,是使用矩陣來求解,時間複雜度o(logn),斐波那契的遞推公式可以表示成如下矩陣形式,katex parse error: no such environment: equation* at position 7: \begin̲ \begin̲ =\begin

\begin a & b\\ c & d \end

像下面這樣的就是列向量,只有一列:

\begin x_1\\ x_2 \end

設katex parse error: no such environment: equation* at position 7: \begin̲a=\begin̲x=\begin̲y=ax= \begin̲ \begin̲ =\begin̲ =\begin̲ =\begin̲ =\begin̲ =\begin̲ \begin=a^*a^//用了三次乘法,兩次乘法計算出a^,最後一次乘法兩個a^相乘

a6=a3∗

a3//

用了三次

乘法,兩

次乘法計

算出a3

,最後一

次乘法兩

個a3相乘a6

=a∗a

∗a∗a

∗a∗a

//五次

乘法,直

接六個a

相乘a^=a*a*a*a*a*a//五次乘法,直接六個a相乘

a6=a∗a

∗a∗a

∗a∗a

//五次

乘法,直

接六個a

相乘還有一種方法,是轉化成為2進製,比如6轉化成為2進製就是110,a6=

a4∗a

2a^=a^*a^

a6=a4∗

a2(10進製)31 = (二進位制) 11111 ,則 a31=

a16∗a

8∗a4

∗a2∗

a1a^=a^*a^*a^*a^*a^

a31=a1

6∗a8

∗a4∗

a2∗a1an

=an∗

an當n

為偶數a^=a^*a^當n為偶數

an=an∗

an當n

為偶數an=

an∗a

n∗a當

n為奇數

a^=a^*a^*a當n為奇數

an=an∗

an∗a

當n為奇

數**如下:

public class solution ,};//最初的陣列

public int fibonacci(int n)

else

return 0;

}public long power(int n,longf)else

}public long fun(long f,long m)

}

還有一種直接求值得公式法,但是有不夠準確的風險。

**如下:

複製**

//直接求值法(利用公式f(n) = [@n/sqrt(5)]快速計算第n個斐波那契數)

public static double fibonacci(int n)

技術之路不在一時,山高水長,縱使緩慢,馳而不息。

lintcode 第17題 子集

要求 給定乙個含不同整數的集合,返回其所有的子集 注意事項 子集中的元素排列必須是非降序的,解集必須不包含重複的子集。樣例 如果 s 1,2,3 有如下的解 3 1 2 1,2,3 1,3 2,3 1,2 思路 不考慮非降序,乙個個數字插進去,每一層插進去乙個,每乙個都有兩種情況,加進去和不加進去。...

《劍指offer》第7題 斐波那契數列

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0,第1項是1 n 39 之前寫過一題是需要返回整個斐波那契數列的,所以此次遞迴借助乙個初始化列表 class solution1 def init self self.fiblist 0 1 前兩項 d...

程式設計題 斐波那契數列

斐波納契數列以遞迴的方法定義 f 0 0,f 1 1,f n f n 1 f n 2 n 2,n n 這個數列從第2項開始,每一項都等於前兩項之和,而且當n趨向於無窮大時,前一項與後一項的比值越來越逼近 分割0.618.1.使用for迴圈實現 def fib n a,b 0,1 for i in r...