要求:查詢斐波納契數列中第 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...