思路
斐波那契数的边界条件是 F(0)=0和F(1)=1F(1)=1.当n>1时,每一项的和都等于前两项的和,因此有如下递推关系:
F(n)=F(n−1)+F(n−2)
由于斐波那契数存在递推关系,因此可以使用动态规划求解.动态规划的状态转移方程即为上述递推关系,边界条件为F(0)和F(1).
根据状态转移方程和边界条件,可以得到时间复杂度和空间复杂度都是O(n)的实现.由于F(n)只和F(n-1)与F(n−2)有关,因此可以使用[滚动数组思想]把空间复杂度优化成 O(1)O(1).
注意:计算过程中,答案需要取模1000000007
java
public int fib(int n) {
if (n < 2) {
return n;
}
int start = 0;
int res = 1;
int temp;
for (int i = 2; i <= n; i++) {
temp = start;
start = res;
res = (temp + start) % 1000000007;
}
return res;
}
go
func fib(n int) int {
if n < 2 {
return n
}
var temp int
start, res := 0, 1
for i := 2; i <= n; i++ {
temp = start
start = res
res = (temp + start) % 1000000007
}
return res
}