斐波那契数列的定义是F[N] = F[N-1] + F[N-2] F[0] =F[1] = 1
如果直接用递归的方法求解,画出递归树可得时间复杂度是O(2^n)
使用记忆话递归,即将已经计算出来的状态存下来,如果发现这个答案已经计算过,则不再递归下去,直接用答案,否则递归下去,时间复杂度是O(N)。
自底向上迭代,时间复杂度O(N)
还可以继续优化到O(logN)
优化的方法将矩阵写成矩阵形式,然后直接计算矩阵幂乘,矩阵幂乘可以用快速幂的方法优化成O(logN)
下面假设下自底向上递归
假设一个整数是10, 快速求解10的75次方
1.75的二进制1001011
2.10的75次方 10^64*10^8*10^2*10^1
先计算10^1, 在根据10^1计算10^2, 由10^2计算10^4, 由10^4计算10^8
double myPow(double x, int n) {
long long N = n;
if (N < 0) {
x = 1 / x;
N = -N;
}
double ans = 1;
double current_product = x;
for (long long i = N; i>0; i /= 2) {
if ((i % 2) == 1) {
ans = ans * current_product;
}
current_product = current_product * current_product;
}
return ans;
}
注: 所谓的通项公式涉及到指数计算,严格来说不能算O(1)