动态规划
边界条件
F(0)=0 和F(1)=1
状态转移方程
n>1:F(n)=F(n−1)+F(n−2)
滚动数组思想
代码
func fib(n int) int {
if n < 2 {
return n
}
p, q, r := 0, 1, 0
for i := 2; i <= n; i++ {
r = p + q
p = q
q = r
}
return r
}
时间复杂度:O(n)。
空间复杂度:O(1)。
矩阵快速幂
快速幂算法:https://blog.csdn.net/qq_19782019/article/details/85621386
type matrix [2][2]int
func mltiply(a, b matrix) (c matrix) {
for i := 0; i < 2; i++ {
for j := 0; j < 2; j++ {
c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j]
}
}
return c
}
func pow(a matrix, n int) matrix {
ret := matrix{{1, 0}, {0, 1}} // 单位矩阵
for ; n > 0; n >>= 1 {
if n&1 == 1 {
ret = mltiply(ret, a)
}
a = mltiply(a, a)
}
return ret
}
func fib(n int) int {
if n < 2 {
return n
}
res := pow(matrix{{1, 1}, {1, 0}}, n-1)
return res[0][0]
}
时间复杂度:O(logn)。
空间复杂度:O(1)。