跳至主要內容

1137. N-th Tribonacci Number


1137. N-th Tribonacci Numberopen in new window

🟢   🔖  记忆化搜索 数学 动态规划  🔗 LeetCodeopen in new window

题目

The Tribonacci sequence Tn is defined as follows:

T0 = 0, T1 = 1, T2 = 1, and Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0.

Given n, return the value of Tn.

Example 1:

Input: n = 4

Output: 4

Explanation:

T_3 = 0 + 1 + 1 = 2

T_4 = 1 + 1 + 2 = 4

Example 2:

Input: n = 25

Output: 1389537

Constraints:

  • 0 <= n <= 37
  • The answer is guaranteed to fit within a 32-bit integer, ie. answer <= 2^31 - 1.

题目大意

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

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

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

解题思路

思路一:动态规划

  1. 动态规划数组:首先创建一个数组 dp,用于存储泰波那契数列的中间状态。

  2. 初始化:初始化前三项,即 dp[0] = 0dp[1] = 1dp[2] = 1,这是泰波那契数列的前三项。

  3. 迭代计算:使用循环从第四项开始迭代计算,每次计算的值是前三项的和。

  4. 返回结果:返回 dp[n],即第 N 个泰波那契数。

  • 时间复杂度: O(n) - 遍历计算动态规划数组。
  • 空间复杂度: O(n) - 使用了一个数组来存储中间状态。

思路二:滚动数组

  1. 滚动数组:考虑到当前项的计算只依赖于前三项,我们可以使用滚动数组的思想,只保留最近的三项,不需要额外的数组存储所有的中间状态。

  2. 初始化:初始化前三项 first = 0, second = 1, third = 1

  3. 迭代计算:从第四项开始迭代计算,每次更新 first, second, third 的值。

  4. 返回结果:返回 third 的值即为所求的第 N 个泰波那契数。

  • 时间复杂度: O(n) - 遍历计算动态规划数组。
  • 空间复杂度: O(1) - 使用了常数个额外变量。

代码

动态规划
/**
 * @param {number} n
 * @return {number}
 */
var tribonacci = function (n) {
	// 创建动态规划数组
	let dp = new Array(n + 1);
	// 初始化前三项
	dp[0] = 0;
	dp[1] = 1;
	dp[2] = 1;

	// 迭代计算
	for (let i = 3; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
	}

	// 返回结果
	return dp[n];
};

相关题目

相关题目
- [70. 爬楼梯](./0070.md)
- [509. 斐波那契数](./0509.md)