剑指offer-7:斐波那契数列
递推时间复杂度O(n)
具体代码如下:
class Solution {
public:
int Fibonacci(int n) {
int a = 0, b = 1;
while(n--){
int c = a + b;
a = b, b = c;
}
return a;
}
};
当 n 更大时考虑矩阵运算 + 快速幂的方法(y总NP)
可以先利用矩阵运算的性质将通项公式变成幂次形式,然后用平方倍增(快速幂)的方法求解第 n项;
首先我们定义向量
Xn=[an an−1],边界:X1=[a1 a0]
然后我们可以找出矩阵:
A
=
[
1
1
1
0
]
(0)
A=\left[ \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right] \tag{0}
A=[1110](0)
则有:
Xn=Xn−1×A
所以:
Xn=X1×An−1
由于矩阵具有结合律,所以我们可以先求出 An−1%P,然后再用 X1 左乘,即可求出 Xn,向量 Xn 的第一个元素就是 an,快速幂的时间复杂度是 O(logn)。
上述算法在大量级的数据优化处理中有显著效果(感谢y总分享)