LeetCode笔记:第 N 个泰波那契数

问题

泰波那契序列  Tn  定义如下:

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0  的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数  n,请返回第 n 个泰波那契数  Tn 的值。

示例 1:

输入: n = 4

输出: 4

解释:

T_3 = 0 + 1 + 1 = 2

T_4 = 1 + 1 + 2 = 4

示例 2:

输入: n = 25

输出: 1389537

提示:

  • 0 <= n <= 37
  • 答案保证是一个 32 位整数,即  answer <= 2^31 - 1

解法一

思路:

动态规划的思想

核心代码就是翻译公式 Tn+3 = Tn + Tn+1 + Tn+2,然后处理下三个边界值 n 为 0、1、2 的时候。

注意一点,如果直接递归返回值测试会出现超时,因为会重复计算前面的值,比如下面就会超时。

超时的案例

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci = function (n) {
  if (n === 0) return 0;
  if (n === 1) return 1;
  if (n === 2) return 1;

  return tribonacci(n - 3) + tribonacci(n - 2) + tribonacci(n - 1);
};

合理的写法是将历史计算值做一个缓存,计算效率就会大大提高。

合理的写法

代码:

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci = function (n) {
  const cache = {};
  return cal(n);

  function cal(s) {
    if (s === 0) return 0;
    if (s === 1 || s === 2) return 1;

    if (cache[s]) return cache[s];

    cache[s] = cal(s - 3) + cal(s - 2) + cal(s - 1);
    return cache[s];
  }
};

解法二

思路:

滚动数组的思想

n 前面的三个数存起来,计算出和,再将和赋值到最后一个位置,依次循环,就可以把前面的数字全部累计相加了

代码:

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci = function (n) {
  if (n === 0) return 0;
  if (n === 1 || n === 2) return 1;

  let a = 0,
    b = 1,
    c = 1,
    sum;
  for (let i = 3; i <= n; i++) {
    sum = a + b + c;
    a = b;
    b = c;
    c = sum;
  }

  return sum;
};

参考

评论