这是我参与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)。