509.斐波那契数列
思路一:一个个计算过去
class Solution {
public int fib(int n) {
if(n<=1)
return n;
int a=0;
int b=1;
for(int i=0;i<n-1;i++){
int tmp = b;
b = a+b;
a = tmp;
}
return b;
}
}
思路二:利用递推公式
X n = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] X_n=\frac{1}{\sqrt5}[(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n] Xn=51[(21+5)n−(21−5)n]
class Solution {
public int fib(int n) {
return (int) Math.round(1/Math.sqrt(5.0)*(Math.pow((1.0+Math.sqrt(5.0))/2.0,(double) n)-Math.pow((1.0-Math.sqrt(5.0))/2.0,(double) n)));
}
}
思路三:对角化矩阵
P = [ 1 1 − 5 − 1 2 5 − 1 2 ] P − 1 = [ ( 5 − 1 ) / ( 2 ∗ 5 ) − 1 / 5 ( 5 + 1 ) / ( 2 ∗ 5 ) 1 / 5 ] P=\begin{bmatrix} 1 & 1\\ \frac{-\sqrt5-1}{2} & \frac{\sqrt5-1}{2} \end{bmatrix} P^{-1}=\begin{bmatrix} (\sqrt5-1)/(2*\sqrt5) & -1/\sqrt5\\ (\sqrt5+1)/(2*\sqrt5) & 1/\sqrt5 \end{bmatrix} P=[12−5−1125−1]P−1=[(5−1)/(2∗5)(5+1)/(2∗5)−1/51/5]
D = [ 1 − 5 2 0 0 1 + 5 2 ] D = \begin{bmatrix} \frac{1-\sqrt5}{2} & 0\\ 0 & \frac{1+\sqrt5}{2} \end{bmatrix} D=[21−50021+5]
因为
[ X n + 1 X n ] = P D P − 1 [ X n X n − 1 ] \begin{bmatrix} X_{n+1} \\ X_{n} \end{bmatrix} = PDP^{-1} \begin{bmatrix} X_{n} \\ X_{n-1} \end{bmatrix} [Xn+1Xn]=PDP−1[XnXn−1]
因此
[ X n X n − 1 ] = P D n − 1 P − 1 [ 1 0 ] \begin{bmatrix} X_{n} \\ X_{n-1} \end{bmatrix} =PD^{n-1}P^{-1} \begin{bmatrix} 1 \\ 0 \end{bmatrix} [XnXn−1]=PDn−1P−1[10]
哈哈,实际上和思路二差不多哈哈哈。