LeetCode探索(十一):1137_第 N 个泰波那契数

188 阅读2分钟

这是我参与11月更文挑战的第 18 天,活动详情查看:2021最后一次更文挑战

题目

泰波那契序列 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。举个例子,我们可以列出几组数字:

T0  T1  T2  T3
0   1   1   2 = 0 + 1 + 1

接着,我们考虑边界情况,当n = 0时,T0 = 0;当n = 1时,T1 = 1;当n = 2时,T2 = 1。那么,我们根据状态转移方程和边界条件,就可以试着去书写代码解决这个问题了。

此时,代码的时间复杂度和空间复杂度都是 O(n),我们可以进一步优化代码。由于 T(n) 只和之前三项有关,因此我们可以使用「滚动数组的思想」将空间复杂度优化成 O(1)

解答

/**
 * @author 觅迹
 * @param {number} n
 * @return {number}
 */
var tribonacci = function(n) {
  // 边界情况
  if (n === 0) {
    return 0
  }
  if (n <= 2) {
    return 1
  }
  let p = 0, q = 0, r = 1, s = 1;
  for (let i = 3; i <= n; ++i) {
    p = q;
    q = r;
    r = s;
    s = p + q + r; // 状态转移方程,例如当 n = 3 时,3 = 0 + 1 + 1
  }
  return s;
};

复杂度分析:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

参考