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]
哈哈,实际上和思路二差不多哈哈哈。