题目描述
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。
给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。
测试样例:3
返回:2
题目解析
普通非递归解法如下:
|
|
时间复杂度O(N)。对于输入数字很大并对时间有要求时,还有更好的解法。参考《剑指offer》P75,数学公式如下。
解决这个公式,可以使用快速矩阵幂,时间复杂度可减小到O(logn)。
参考答案
|
|