LeetCode第509题斐波那契数(js实现思想参考up JS老毕)
题目
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。
示例 1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
提示:
0 ≤ N ≤ 30
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思想(动态规划)
1.动态规划的基本思想:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式 。
2.在这题中我们采用动态规划的思想做,从下而上,先求解子问题,如下图所示:
我们已知f(1)和f(0)的值,然后挨个求解f(2),f(3)等。我们创建一个数组,将f(0),f(1)等的值存入,每当求解出一个该数组中没有的值,都将这个值存入数组中,以此来避免重复计算。每当计算后面的值,要用到之前出现过的值时,我们都从该数组中进行调用,然后再存入新的,如此循环往复。
代码
// atom-one-night
var fib = function(N) {
if (N <= 1){
return N;
}
const cache = [];
cache[0] = 0;
cache[1] = 1;
function memoize(number){
if(cache[number] !== undefined){
return cache[number];
}
cache[number] = memoize(number -1) + memoize(number -2);
return cache[number];
}
const result = memoize(N);
return result;
}