携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
一、题目描述:
509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
- 0 <= n <= 30
二、思路分析:
- 递归 大量重复计算 fn = fn-1 + fn-2
- 递归+缓存 重复计算的值存储起来
- 循环 中间变量保存
- 动态循环 数组储存dp[n]的值
三、AC 代码:
// f(n) = f(n-1)+ f(n-2) n>1
function fib(n: number): number {
// 递归 后面的值 依托于 前面的值
// 产生重复计算的情况 可利用缓存
// if (n <=1) return n
// return fib(n-1) + fib(n-2)
// 缓存 减少重复计算情况
// const cache: Map<number, number> = new Map()
// function helper(map: Map<number, number>, n: number) {
// if (n <=1) return n // 递归结束条件
// if(map.get(n) !== undefined) return cache.get(n)
// const r = helper(map, n-1) + helper(map, n-2)
// map.set(n, r)
// return r
// }
// return helper(cache, n)
// 循环利用中间变量保存前一次计算的值
// if (n <=1) return n
// let [a, b] = [0, 1]
// for (let i =2; i<=n; i++) {
// [a, b] = [b, a + b]
// }
// return b
// 利用dp数组存储每次计算的值
if (n <=1) return n
const dp: number[] = []
dp[0] = 0
dp[1] = 1
for (let i=2; i<= n; i++) {
dp[i] = dp[i-1] + dp[i-2]
}
return dp[n]
};
范文参考: