Skip to content

Latest commit

 

History

History
156 lines (112 loc) · 4.17 KB

1137.md

File metadata and controls

156 lines (112 loc) · 4.17 KB
title description keywords
1137. 第 N 个泰波那契数
LeetCode 1137. 第 N 个泰波那契数题解,N-th Tribonacci Number,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
1137. 第 N 个泰波那契数
第 N 个泰波那契数
N-th Tribonacci Number
解题思路
记忆化搜索
数学
动态规划

1137. 第 N 个泰波那契数

🟢 Easy  🔖  记忆化搜索 数学 动态规划  🔗 力扣 LeetCode

题目

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),使用了常数个额外变量。

代码

::: code-tabs

@tab 动态规划

/**
 * @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];
};

@tab 滚动数组

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci = function (n) {
	if (n == 0) return 0;
	if (n == 1) return 1;
	// 初始化前三项
	let first = 0;
	let second = 1;
	let third = 1;

	// 迭代计算
	for (let i = 3; i <= n; i++) {
		let temp = first + second + third;
		first = second;
		second = third;
		third = temp;
	}
	// 返回结果
	return third;
};

:::

相关题目

题号 标题 题解 标签 难度 力扣
70 爬楼梯 [✓] 记忆化搜索 数学 动态规划 🟢 🀄️ 🔗
509 斐波那契数 [✓] 递归 记忆化搜索 数学 1+ 🟢 🀄️ 🔗