这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
leetcode1137:第n个泰波那契数
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
输入: n = 4
输出: 4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
解题思路分析
解法1
首先我们要了解一下什么是泰波那契数。根据题目描述可以判断出,所谓的泰波那契数,也就是每一个节点的值,等于该节点向前三个节点值的总和。而题目中已经定义,开始的三个节点,数值分别为0,1,1。因此可以轻易推断出,第四节点值为2,第五节点值为4。而想要知道第n个节点的值,只需要先计算n-1,n-2,n-3三个节点的值,然后计算三个节点的总和即可得到第n个节点的值。其中很容易的想法是通过递归操作。而本方案不采用递归的方式,选择采用动态规划的思路进行处理。考虑到动态规划,则需要一个dp数组,数组内存储的内容则为每个节点的数值即可。此处后续进行了优化,暂时不谈。另外要对于初始三个特殊节点的值进行指定。而对于状态转移方程,则直接采用题目的定义即可,第n个节点值等于之前三个节点值的总和。到此,题目本身已经解题完毕。而考虑到实际只要第n个节点,则可以将dp数组修改为之前三个节点的值循环利用,即可对空间复杂度进行优化。至此,题目解题完毕。
public int tribonacci(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else if(n == 2){
return 1;
}
int a=0,b=1,c=1,d=0;
for (int i = 3; i <= n; i++) {
d = a + b + c;
a = b;
b = c;
c = d;
}
return d;
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。