思路一(动态规划)
状态转移方程已经给出,边界值也给出。用dp[n]记录下f[n]。相比递推节省很多不必要的计算。
代码
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
var dp = new Array(n+1);
dp[0] = 0;
dp[1] = 1;
for(let i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
if(dp[i] > Math.pow(10,9)+7) dp[i] = dp[i] % (Math.pow(10,9)+7);
}
return dp[n];
};
思路二(改进版动态规划)
题目只需求f(n),dp[n]只与第n-1和第n-2项有关。不需要开辟一个n维的数组dp[n]来分别记录dp[1]~dp[n]。只需要初始化三个整形变量 a, b ,c利用辅助变量 c使 a, b两数字交替前进即可 ,这样使空间复杂度降至O(1)
代码
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
var dp = new Array(n+1);
if(n == 0) return 0;//特例处理:n=0时,返回0
a = 0;//相当于f(n-2)
b = 1;//相当于f(n-1)
for(let i = 2; i <= n; i++) {
c = a + b;//c相当于f(n)
if(c > Math.pow(10,9)+7) c = c % (Math.pow(10,9)+7);
a = b;
b = c;
}
return b;
};