1137. 第N个泰波那契数
贴个题目:
贴个示例:
解题思路:
这一题和斐波那契数列数列其实本质上是一样的,不过多了一个变量而已,相信大家都做过斐波那契数列,知道有两种方法:1、动态规划,2、递归
1、动态规划:
首先我们来介绍动态规划,为什么要用动态规划呢?因为动态规划比递归更加省时间,它能够减少递归那些重复计算的步骤。
我们使用t1代表第一个变量,t2代表第二个变量,t3代表第三个变量,中间应该用一个temp存储t3的值,因为t3=t1+t2+t3的时候会把t3给覆盖掉。
其实就是利用滚动数组的原理,不断计算下一个泰波那契数,然后覆盖,然后往下计算。
这里不使用动态规划数组的原因是,我们只需要知道最后的结果,中间的过程不需要知道,因此没有必要储存起来浪费空间。
动态规划代码:
int tribonacci(int n){
if(n==0) return 0;
int t1=0;//初始化数字
int t2=1;
int t3=1;
for(int i=0;i<n-2;i++)//注意循环次数是n-2次
{
int temp=t3;//存储t3的初始值,方便等一下往下传递
t3=t1+t2+t3;//t3等于泰波那契数
t1=t2;//滚动储存
t2=temp;//滚动储存t3
}
return t3;
}
性能分析:
时间分析:
这里我们进行了一次遍历,因此时间复杂度是:O(n)
性能分析:
只创建了常数个变量,因此是空间复杂度是:O(1)
2、递归法
这里使用递归会超时,虽然代码简洁明了(大概在第35个测试用例就会超时)
递归代码:
int tribonacci(int n){
if(n==0||n==1||n==2) return n==0?0:1;
return tribonacci(n-3)+tribonacci(n-2)+tribonacci(n-1);
}
性能分析:
时间分析:
使用递归的时候,画一个递归树:
可以看出,每个T都被分成3个子T,因此可以看出时间复杂度是:O(3^n)
空间分析:
没有新建变量,因此空间复杂度是:O(1)