1137. 第 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

方法一:空间优化:动态计算

  • 如果 n < 3,答案可直接得出。

  • 否则,初始化前 3 个斐波那契数字 x = 0, y = z = 1,并执行 n - 2 步循环。循环的每一步:

    • 令 x = y

    • 令 y = z

    • 令 z = x + y + z

    • 返回z。
class Solution {
public int tribonacci(int n) {
if (n < 3) return n == 0 ? 0 : 1; int tmp, x = 0, y = 1, z = 1;
for (int i = 3; i <= n; ++i) {
tmp = x + y + z;
x = y;
y = z;
z = tmp;
}
return z;
}
}

复杂度分析

  • 时间复杂度:O(N)。

  • 空间复杂度:O(1),保存最后 3 个斐波那契数。

方法二:性能优化:带记忆的递归

预计算 38 个斐波那契数:

  • 初始化一个数组 nums 用于保存斐波那契数,并记录前 3 个斐波那契数。

  • 返回 helper(n - 1)

递归方法 helper(k)

  • 如果 k == 0,返回 0。
  • 如果 nums[k] != 0,返回 nums[k]。
  • 否则 nums[k] = helper(k - 1) + helper(k - 2) + helper(k - 3),返回 nums[k]。

从预计算的数组中检索所需的斐波那契数。

class Tri {
private int n = 38;
public int[] nums = new int[n]; int helper(int k) {
if (k == 0) return 0;
if (nums[k] != 0) return nums[k]; nums[k] = helper(k - 1) + helper(k - 2) + helper(k - 3);
return nums[k];
} Tri() {
nums[1] = 1;
nums[2] = 1;
helper(n - 1);
}
} class Solution {
public static Tri t = new Tri();
public int tribonacci(int n) {
return t.nums[n];
}
}

复杂度分析

时间复杂度:O(1),预计算 38 个斐波那契数,并在数组中检索。

空间复杂度:O(1),存储 38 个斐波那契数的数组。

方法三:性能优化:动态计算
  预计算 38 个斐波那契数:

  初始化一个数组用于保存斐波那契数,并初始化前 3 个斐波那契数字。

  i 从 3 循环到 38,每一步计算出一个新的斐波那契数:nums[i] = helper(i - 1) + helper(i - 2) + helper(i - 3)。

  从数组中检索所需的斐波那契数。

class Tri {
private int n = 38;
public int[] nums = new int[n];
Tri() {
nums[1] = 1;
nums[2] = 1;
for (int i = 3; i < n; ++i)
nums[i] = nums[i - 1] + nums[i - 2] + nums[i - 3];
}
} class Solution {
public static Tri t = new Tri();
public int tribonacci(int n) {
return t.nums[n];
}
}

1137. 第 N 个泰波那契数的更多相关文章

  1. 刷题-力扣-1137. 第 N 个泰波那契数

    1137. 第 N 个泰波那契数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-th-tribonacci-number 著作权 ...

  2. LeetCode.1137-第N个泰波那契数(N-th Tribonacci Number)

    这是小川的第409次更新,第441篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第260题(顺位题号是1137).Tribonacci(泰波那契)序列Tn定义如下: 对于n&g ...

  3. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

    大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

  4. 斐波那契数[XDU1049]

    Problem 1049 - 斐波那契数 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 1673  Ac ...

  5. C++求斐波那契数

    题目内容:斐波那契数定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n为整数) 如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 …… ...

  6. Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数

    Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1 ...

  7. DP:斐波纳契数

    题目:输出第 n 个斐波纳契数(Fibonacci) 方法一.简单递归 这个就不说了,小n怡情,大n伤身啊……当n=40的时候,就明显感觉到卡了,不是一般的慢. //输出第n个 Fibonacci 数 ...

  8. HDU4549 M斐波那契数

    M斐波那契数列 题目分析: M斐波那契数列F[n]是一种整数数列,它的定义例如以下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 如今给 ...

  9. HDU 5914 Triangle(打表——斐波那契数的应用)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...

随机推荐

  1. 网络图片下载,commons IO包

    网络图片下载,commons IO包 导入commons-io包 commons-io包下载路径: http://www.apache.org/ 项目下新建lib包,将lib包添加为库 实现多线程下载 ...

  2. Linux C中strcpy , strncpy , strlcpy 的区别

    strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. s ...

  3. awk-02-内置变量

    内置变量 示例 1 FS和OFS 2 RS和ORS 3 NF是字段个数 4 NR和FNR NR 统计记录编号,每处理一行记录,编号就会+1,FNR 不同的是在统计第二个文件时会重新计数 NR和FNR区 ...

  4. Blazor+Dapr+K8s微服务之服务调用

    1.1         Dapr环境配置 1.1.1        在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和 ...

  5. NOIP 模拟 $31\; \rm Time$

    题解 \(by\;zj\varphi\) 考虑如何才能最优. 每次一定把当前最小值移动到边界上,那么看它向左还是向右移更优. 用树状数组维护一下即可,复杂度 \(\mathcal O\rm (nlog ...

  6. 如何修改leaflet的marker图标

    1. 从官网中查看对应文档:https://leafletjs.com/ 2. 3. var greenIcon = L.icon({ iconUrl: 'leaf-green.png', shado ...

  7. C++类的构造函数后面加一个冒号的含义

    最近在看侯捷老师讲解的C++知识,他讲到在构造函数加一个冒号初始化值的方法,会使代码更大气,在此记录一下使用方法 构造函数冒号后的初始化class complex{public: complex(do ...

  8. C++ 矩形交集和并集的面积-离散化

    //离散化,x,y坐标分别按从小到大排序 //离散化 //1.首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中. //2. 设数组XY[ ][ ].对于每个矩形(x1,y1)(x2 ...

  9. css - 响应式

    css - 响应式 移动设备尺寸 移动设备的尺寸各不相同,大体上可以做如下划分: 768px以下的是手机屏幕 768px-991px是平板ipad屏幕 992px-1199是大平板屏幕 1200极其以 ...

  10. spring整合LOG4J2日志

    POM文件 <!-- Log Begin --> <slf4j.version>1.7.24</slf4j.version> <log4j2.version& ...